it-swarm.com.de

So überspringen Sie die Zeile beim Import eines fehlerhaften MySQL-Dumps

Gegebenes falsches mysqldump, das Fehler beim Import verursacht:

namtar backups # mysql -p < 2010-12-01.sql
Enter password: 
ERROR 1062 (23000) at line 8020: Duplicate entry 'l�he?' for key 'wrd_txt'

Gibt es eine einfache Möglichkeit, den Import anzuweisen, eine bestimmte Zeile zu überspringen und fortzufahren?

(Ja, ich weiß, dass ich die Datei oder die Analyse manuell bearbeiten kann, aber das ist nicht sehr praktisch.)

35
Almad

Wenn Sie den Dump erneut durchführen können, können Sie beim Dump der Befehlszeile --insert-ignore Hinzufügen.

Oder Sie können versuchen, den Befehl mysqlimport mit --force Zu verwenden, der auch dann fortgesetzt wird, wenn MySQL-Fehler auftreten.

46
jmlsteele

mysql -f -p < 2010-12-01.sql

das -f (Kraft) hier die operative Option zu sein, hat für mich funktioniert.

36

Befolgen Sie den Ratschlag von jmlsteeles Antwort und Kommentar und wandeln Sie die Beilagen in INSERT IGNORE im laufenden Betrieb.

Wenn Sie aus einer sql Datei importieren:

sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" < 2010-12-01.sql | mysql -p

Wenn Sie aus einer gz -Datei importieren, leiten Sie einfach die Ausgabe von gunzip nach sed, anstatt die Dateieingabe zu verwenden:

gunzip < 2010-12-01.sql.gz | sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" | mysql -p
22
Ben

Die anderen Optionen sind durchaus realisierbare Optionen, aber eine andere Lösung wäre, einfach die Datei .sql Zu bearbeiten, die aus dem mysqldump stammt.

Veränderung:

INSERT INTO table_name ...

ZU

INSERT IGNORE INTO table_name ...
1
PromInc

Nur ein Gedanke, haben Sie die MySQL-Direktiven oben auf dem Dump gelöscht? (Ich habe es versehentlich getan, als ich eine Wiederherstellung nach dem Löschen aller Datensätze/Tabellen, die ich bereits mit einem sed-Befehl eingefügt hatte, neu gestartet habe.) Diese Direktiven weisen MySQL unter anderem an, keine eindeutigen Tests, Fremdschlüsseltests usw. durchzuführen.

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;
/*!40101 SET @[email protected]@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @[email protected]@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;
1
zzapper

Toller Tipp. Ich habe es ein wenig anders gemacht, aber das gleiche Ergebnis.

Perl -pi -e 's/INSERT INTO/INSERT IGNORE INTO/g' filename.sql
0
Robert Saylor