我有一个迁移脚本,我们在其中将数据从一个数据库迁移到另一个数据库。


  我的$ dbh1 = DBI-> connect($ dsn1,$ userid,$ password,{mysql_enable_utf8 => 1})或死于$ DBI :: errstr;
  我的$ 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;



在执行上述循环时,如果断开连接,则我们将重新连接并继续循环。我们怎样才能做到这一点?

最佳答案

使用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($@) {
    reconnect... etc...
  }
  eval {
    @row = $select->fetchrow_array();
  }; if($@) {
    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

关于mysql - 迁移perl dbi脚本导致DBD::mysql::st执行失败:MySQL服务器已经消失了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39739528/

10-15 00:59