2016-07-05 13 views
0

Ich arbeite an einer Webanwendung, die eine Datenbank mit zwei Tabellen abfragt. Ich denke, ich habe ein Problem mit der Datenbeschädigung. Einer meiner Tische ist in Ordnung, und ich habe es abgeladen und gesichert. Ich habe die Datenbank aus einigen MongoDB-Daten, die ich analysiert habe, mit einem Python-Skript gefüllt.Wie löst man ein Problem mit Datenkorruption? Ich kann keine SQL-Abfragen für die Tabelle ausführen

Ich verwende HeidiSQL, um mit meiner Datenbank zu arbeiten, und ich kann die beschädigte Tabelle nicht anzeigen, wenn ich "innodb_force_recovery = 4" (was ich glaube, erstellt eine schreibgeschützte Version von Tabellen) in my.ini angeben. Trotzdem kann ich keine mysqldump in der Tabelle ausführen, nachdem ich diese Bedingung angegeben habe.

Dann dachte ich, vielleicht war es ein Problem mit HeidiSQL. Es war nicht. Selbst von der Befehlszeile mysqld konnte ich keine Aktionen für die beschädigte Datenbank ausführen. Unten zeige ich die Fehlermeldung, die ich bekommen habe.

Error message in mysqld as viewed via command line

Auch das XAMPP Control Panel führt den folgenden Fehler beim Start:

160705 14:41:34 [ERROR] mysqld bekam Ausnahme 0x80000003; Dies könnte daran liegen, dass Sie einen Fehler gefunden haben. Es ist auch möglich, dass diese Binärdatei oder eine der Bibliotheken, mit denen sie verknüpft wurde, beschädigt, falsch aufgebaut, oder falsch konfiguriert ist. Dieser Fehler kann auch durch fehlerhafte Hardware verursacht werden.

So. An diesem Punkt könnte ich mein Python-Skript erneut ausführen, aber ich nehme an, dass ich den gleichen Fehler treffen würde.

Wie empfehlen Sie, dieses Problem zu beheben?

Antwort

0

Der Tablespace ist beschädigt und Ihr ultimatives Ziel ist es, einen Dump zu erstellen und InnoDB-Tablespaces von Grund auf neu zu erstellen.

Wenn Sie mit innodb_force_recovery=4 beginnen, speichern Sie alle Tabellen nacheinander ab. Schreiben Sie ein Skript, das alle Datenbanken und alle Tabellen durchläuft. Fügen Sie --skip-lock-tables zu mysqldump hinzu, manchmal hilft es.

Dann versuchen Sie höhere Werte von innodb_force_recovery: 5 und 6. Versuchen Sie, restliche Tabellen, die MySQL abgestürzt sind, mit innodb_force_recovery=4 auszugeben.

Wenn Sie immer noch nicht in der Lage sind, Tabellen zu dumpen, dann googeln Sie nach "percona data recovery toolkit" oder "undrop-for-innodb". Diese Tools arbeiten beide mit InnoDB-Tabellenbereichen auf niedriger Ebene und ermöglichen das Abrufen von Datensätzen von InnoDB-Seiten, die beschädigte Bereiche überspringen.

Wenn Sie alle Dumps haben, entfernen Sie alle innodb-Dateien (ibdata1, ib_logfile * und * .ibd, falls vorhanden) und importieren Sie die Dumps.

+0

Vielen Dank für Ihre Antwort. Ich habe noch nie in MySQL geschrieben, also werde ich das als späteren Ausweg versuchen :). Ich bin zweifelhaft, dass mysqldump funktioniert, einfach weil ich nicht auf die Tabelle zugreifen kann - mysqld stürzt sofort ab. Ich werde in "Percona Data Recovery Toolkit" und "Undrop-for-Innodb" – ksani

+0

ich meine, ein Shell-Skript untersuchen. etwas wie 'for d in $ (mysql -NBe 'zeige Datenbanken'); do für t in $ (mysql -NBe 'show tables' $ d); do mysqldump --skip-lock-tables $ d $ t> $ d- $ t.sql; erledigt; fertig. Viel Glück. – akuzminsky