2016-09-28 54 views
0

我有一個遷移腳本,我們將數據從一個數據庫遷移到另一個數據庫。遷移perl dbi腳本導致DBD :: mysql :: st執行失敗:MySQL服務器已消失

my $ dbh1 = DBI-> connect($ dsn1,$ userid,$ password,{mysql_enable_utf8 => 1})或者死於$ DBI :: errstr;
my $ dbh2 = DBI-> connect($ dsn2,$ userid,$ password,{mysql_enable_utf8 => 1})或者死於$ 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