2010-11-28 2 views
2

Ich habe eine große MySQL 5 Datenbank für eine drupal Website auf einem alten Rechner. Nach dem Sichern und auf eine frische Datenbank wiederherstellen, ich habe:Wie überprüfe ich die MySQL-Integrität?

ERROR 1064 (42000) in Zeile * *: Sie einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das entspricht Ihre MySQL-Server-Version für die richtige Syntax zu verwenden in der Nähe von '' captcha_success_form_ids | a: 1: {s: 13: \ "user_register \"; s: 13: \ "user_register \"; } sp‘ in Zeile 1

ich bin nicht sicher, welche Tabelle die origion dieses Fehlers ist (ich keine Tabelle mit dem Namen haben‚user_register‘). Ich frage mich also, wie ich die Originaldatenbank schnell auf Integrität überprüfen kann, bevor ich einen weiteren fehlgeschlagenen Backup/Restore-Versuch unternehme. (Ich habe Zugriff auf die Befehlszeile). Dank

+0

Es ist nicht die Tabelle user_register, es ist die Daten, die Sie versuchen, einzufügen, scheint, dass Sie serialisieren, und versuchen Sie, diese –

+0

Wie erzeugen Sie die Sicherung? Verwenden Sie beispielsweise mysqldump, MySQL Administrator usw.? Versuchen Sie es mit mysqldump und sehen Sie, ob Sie den gleichen Fehler bekommen. – cbranch

+0

@Haim: Wie kann ich den Fehler loswerden? – qliq

Antwort

2

Das in der Fehlermeldung zitierte Fragment sieht nichts, wie MySQL - es sieht aus wie serialisierten PHP-Daten, die ich denken lassen Sie Ihre Daten nicht richtig Flucht in der Code. Hat sich Ihre PHP-Installation geändert? Besonders die Smartquotes? (Beachten Sie, dass smartquotes jetzt veraltet ist).

+0

+1 Dies ist eine bessere Antwort als meine. Ich stimme zu, dass es sich um ein Fluchtproblem handelt. Die Frage ist, ob der Fehler auftritt, wenn Sie die Datenbank importieren (d. H. Fehler/Problem mit mysqldump), oder später, wenn die Anwendung ausgeführt wird (d. H. Fehler/Problem mit PHP-Code oder config). – cbranch

3

Wenn Sie Korruption in der ursprünglichen Datenbank vermuten, können Sie wie folgt vorgehen:

Für MyISAM-Tabellen:

CHECK TABLE <table_name>; 
REPAIR TABLE <table_name>; 

Für InnoDB-Tabellen:

http://www.mysqlperformanceblog.com/2008/07/04/recovering-innodb-table-corruption/

I‘ In einigen wenigen Fällen, die von CHECK und REPAIR erkannt und korrigiert werden konnten, sah ich persönlich Korruption mit MyISAM-Tabellen. Ich habe noch nie Korruption mit InnoDB-Tabellen erlebt und kann daher nicht aus eigener Erfahrung über die im Link angegebenen Informationen sprechen.

Das gesagt, wenn ich in Ihren Schuhen wäre, würde ich beginnen, indem ich mir die von mysqldump erzeugte Ausgabedatei genauer ansehe, um zu sehen, ob ich die Quelle des Fehlers lokalisieren könnte. mysqldump gibt normalerweise eine einzelne INSERT-Anweisung pro Tabelle mit allen Daten in einer einzigen Zeile aus, daher ist es ein wenig schwierig, Fehler zu diagnostizieren, weil die in der Fehlermeldung enthaltene Zeilennummer nicht viel hilft. Also, was ich tun würde, ist die mysqldump-Ausgabedatei zu bearbeiten und neue Zeilen zwischen jeder Zeile einzufügen. Zum Beispiel:

Original:

INSERT INTO table VALUES (a,b,c),(d,e,f),(g,h,i), ... 

ändern:

INSERT INTO table VALUES (a,b,c), 
(d,e,f), 
(g,h,i), 
... 

Da Sie mit der Kommandozeile vertraut sind, könnten Sie wahrscheinlich automatisieren dies mit sed etc.

Versuchen Sie dann, die geänderte Datei zu importieren. Sie sollten den gleichen Fehler erhalten, aber dieses Mal hilft die Zeilennummer, die genaue Zeile zu lokalisieren, die das Problem verursacht. An diesem Punkt sollten Sie in der Lage sein, das Problem zu diagnostizieren (oder den fehlerhaften Teil der mysqldump-Ausgabe hier zu veröffentlichen, und wir werden versuchen, zu helfen).

EDIT:

wird die Fehlermeldung Ihnen geschieht zitiert, wenn Sie Import die Datenbank? Oder wird die Datenbank erfolgreich importiert, aber die Anwendung erzeugt die Fehlermeldung beim Zugriff auf die Datenbank? Ich nahm das erstere an, aber jetzt denke ich, dass es letzteres sein könnte, nachdem du deine Frage erneut gelesen hast.

Eine weitere Idee: Enthält Ihre Datenbank gespeicherte Procs? Wenn dies der Fall ist, wird mysqldump diese standardmäßig nicht einschließen. Sie müssen die --routines Option verwenden:

mysqldump --routines -u <user> -p<password> <database> > output