Wie kann ich eine InnoDB-Tabelle reparieren?
Frage
Wir (scheinbar) waren schlecht unseren Solaris MySQL-Datenbank-Engine letzte Nacht ausgeführt. Wenigstens einige der InnoDB-Tabellen beschädigt sind, mit Zeitstempel aus, um Fehler im Transaktionsprotokoll und ein spezifischer Fehler über den Index beschädigt werden.
Wir wissen, über die Werkzeuge für MyISAM-Tabelle Reparaturen zur Verfügung, kann aber nichts für InnoDB finden.
Randbemerkung: eine Tabelle optimize (in meinem Versuch, den beschädigten Index neu zu erstellen) versucht, bewirkt, dass der Datenbankserver zum Absturz
.Lösung
Zu allererst stoppen Sie den Server und Bild der Disc . Es gibt nur keinen Sinn, einen Schuss auf diese hat. Hier finden Sie aktuelle rel="noreferrer">.
Andere Tipps
stoppen Ihre Anwendung ... oder deinen Sklaven stoppen, so dass keine neue Zeilen hinzugefügt werden
create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table <old table>;
insert <old table> select * from <new table>;
Starten Sie Ihren Server oder Slave
Die folgende Lösung von Sandro Tipp oben inspiriert wurde.
Warnung , während es für mich gearbeitet, aber ich kann nicht sagen, ob es für Sie arbeitet.
Mein Problem war folgendes: einige bestimmte Zeilen aus einer Tabelle zu lesen (lassen Sie uns diese Tabelle broken
nennen) abstürzen würde MySQL. Auch SELECT COUNT(*) FROM broken
würde es töten. Ich hoffe, Sie haben einen PRIMARY KEY
auf dieser Tabelle (in dem folgenden Beispiel, es ist id
).
- Stellen Sie sicher, dass Sie ein Backup oder Snapshot des gebrochenen MySQL-Server (nur für den Fall Sie will zurück zu Schritt 1 und versuchen, etwas anderes!)
-
CREATE TABLE broken_repair LIKE broken;
-
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
- Wiederholen Sie Schritt 3, bis er die DB abstürzt (können Sie
LIMIT 100000
verwenden und dann niedrigere Werte verwenden, bis mitLIMIT 1
stürzt die DB). - Sehen Sie, wenn Sie alles haben (Sie
SELECT MAX(id) FROM broken
mit der Anzahl der Zeilen inbroken_repair
vergleichen kann). - An diesem Punkt hatte ich anscheinend alle meine Zeilen (mit Ausnahme derjenigen, die durch InnoDB wahrscheinlich rigoros gekürzt wurden). Wenn Sie einige Zeilen verpassen, könnten Sie eine
OFFSET
zumLIMIT
versuchen hinzuzufügen.
Viel Glück!
Hier ist die Lösung von MySQL zur Verfügung gestellt: http://dev.mysql.com/doc/refman /5.5/en/forcing-innodb-recovery.html
Lesen Sie diesen Artikel: http://www.unilogica.com/mysql-innodb-recovery / (es ist in portugiesisch)
erklärt, wie verwenden innodb_force_recovery und innodb_file_per_table . Ich entdeckte diese nach Bedarf zu Erholung ein abgestürzt Datenbank mit einem einzigen ibdata1 .
Mit innodb_file_per_table, alle Tabellen in InnoDB eine getrennte Tabellendatei, wie MyISAM erstellen.
Schritt 1:
Stop MySQL-Server
Schritt 2:
Fügen Sie diese Zeile my.cnf (In Fenster es heißt my.ini)
set-variable=innodb_force_recovery=6
Schritt 3
löschen ib_logfile0 und ib_logfile1
Schritt 4.
Start MySQL Server
Schritt 5.
Führen Sie diesen Befehl:
mysqlcheck --database db_name table_name -uroot -p
Nach der erfolgreichen abgestürzt innodb Tisch befestigt haben, vergessen Sie nicht # set-variable = innodb_force_recovery = 6 aus my.cnf und starten Sie MySQL-Server erneut.
zu entfernen