2016-09-28 10 views
0

私は移行スクリプトを用意しています。DBD :: mysql :: stの実行に失敗したperl dbiスクリプトの移行が失敗しました:MySQLサーバーが廃止されました

my $ dbh1 = DBI-> connect($ dsn1、$ userid、$ password、{mysql_enable_utf8 => 1})またはdie $ DBI :: errstr;
my $ dbh2 = DBI-> connect($ dsn2、$ userid、$ password、{mysql_enable_utf8 => 1})またはdie $ DBI :: errstr;

ここで、dbh1からdbh2にデータを移行します。スクリプトを実行している間DBD :: mysql :: stの実行に失敗しました:MySQLサーバーが廃止されました

接続が失敗した場合は、再接続してスクリプトを続行します。どうすればそれを処理できますか?

$select = $dbh1->prepare("SELECT * FROM ADAP"); 
$insert = $dbh2->prepare("INSERT INTO ADAP VALUES (?,?,?,?,?,?,?)"); 
$select->execute; 
while (my ($ID,$STA,$UR,$TY) = $select->fetchrow_array) { 
    $insert->execute($ID,$STA,$UR,$TY,'NULL','N','N'); 
if(!$insert->err) 
{ 
    $rows2+=1; 
} 
} 
$rows1 = $select->rows(); 
print "\n Total $rows2 copied out of $rows1 \n"; 
$rows2=0; 

ループ上に実行しつつ切断ならば、我々はループを再接続し続けます。どうすればこれを達成できますか?エラーをキャッチする

+2

はMySQLサーバが離れて行ってしまった「理由を見つける方が良いと思いませんか? my.cnfの 'max_allowed_pa​​cket'よりも挿入物が大きいときに、時々このような問題があることがわかりました。 – MichielB

答えて

0

使用eval

$select = $dbh1->prepare("SELECT * FROM ADAP"); 
$insert = $dbh2->prepare("INSERT INTO ADAP VALUES (?,?,?,?,?,?,?)"); 
$select->execute; 
my @row = $select->fetchrow_array(); 
while(@row) { 
    eval { # suggest a fxn call, but you get it... 
    $insert->execute($row[0],$row[1],$row[2],$row[3],'NULL','N','N'); 
    ++$rows2 if !$insert->err; 
    }; if([email protected]) { 
    reconnect... etc... 
    } 
    eval { 
    @row = $select->fetchrow_array(); 
    }; if([email protected]) { 
    reconnect... etc... 
    } 
} 

あなたはまた、バッチ作業する必要があります

SELECT * FROM ADP WHERE id > __ ORDER BY id ASC LIMIT 1000; # assumed indexed... 
MAKE 1 single INSERT STATEMENT w/ the 1k rows to insert 
EXECUTE the insert statement 
repeat next batch 
関連する問題