我有一个迁移脚本,我们在其中将数据从一个数据库迁移到另一个数据库。
我的$ 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/