2016-09-28 1 views
0

gegangen Ich habe ein Migrationsskript, wo wir die Daten von einer Datenbank zu einer anderen Datenbank migrieren.Migration perl dbi Skript führt DBD :: mysql :: st ausführen fehlgeschlagen: MySQL Server ist um

my $ dbh1 = DBI-> connect ($ dsn1, $ userid, $ password, {mysql_enable_utf8 => 1}) oder $ DBI :: errstr sterben;
mein $ dbh2 = DBI-> verbinden ($ dsn2, $ userid, $ passwort, {mysql_enable_utf8 => 1}) oder sterben $ DBI :: errstr;

wo die Daten von dbh1 zu dbh2 migrieren. während das Skript ausgeführt wird. Wir bekommen Fehler wie: DBD :: mysql :: st ausführen fehlgeschlagen: MySQL Server ist weggegangen bei

Wenn die Verbindung fehlgeschlagen ist, wollen wir wieder verbinden und unser Skript fortsetzen. Wie können wir damit umgehen?

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

während über Schleife ausgeführt wird, wenn getrennt, dann würden wir wieder an und die Schleife fortzusetzen. Wie können wir das erreichen?

+2

Wäre es nicht besser sein, um herauszufinden, warum die 'MySQL Server weg ist'? Ich habe manchmal Probleme wie diese gefunden, wenn meine Einfügungen größer sind als 'max_allowed_packet' in' my.cnf'. – MichielB

Antwort

0

Verwenden eval Fehler abzufangen:

$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... 
    } 
} 

Sie sollten auch Batch-Arbeit:

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 
Verwandte Themen