迁移perl dbi脚本导致DBD :: mysql :: st执行失败:MySQL服务器已经消失了

时间:2016-09-28 06:26:57

标签: mysql perl dbi

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

  

我的$ 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;

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

1 个答案:

答案 0 :(得分: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