38 Stimmen

Wie kann ich eine InnoDB-Tabelle reparieren?

Unsere Solaris-MySQL-Datenbank-Engine wurde gestern Abend (offenbar) schlecht ausgeführt. Zumindest einige der InnoDB-Tabellen sind beschädigt, mit Zeitstempelfehlern im Transaktionsprotokoll und einem speziellen Fehler über einen beschädigten Index.

Wir kennen die Tools, die für die Reparatur von MyISAM-Tabellen zur Verfügung stehen, können aber nichts für InnoDB finden.

Nebenbemerkung: Der Versuch, eine Tabelle zu optimieren (in meinem Versuch, den beschädigten Index wiederherzustellen), führt zum Absturz des Datenbankservers.

2 Stimmen

Wiederherstellung aus Sicherungskopien. Sie haben Backups, richtig?

30voto

Jon Topper Punkte 3086

Zuallererst den Server anhalten und den Datenträger sichern . Es macht keinen Sinn, es nur einmal zu versuchen. Dann schauen Sie mal ici .

2 Stimmen

Es scheint, dass der Link einen anderen Inhalt hat, nicht wahr?

27voto

Sandro Frattura Punkte 251

Stoppen Sie Ihre Anwendung... oder stoppen Sie Ihren Slave, damit keine neuen 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>;

Ihren Server oder Slave neu starten

0 Stimmen

Danke - ich fand diese Lösung recht nützlich, da der Benutzer den Server nicht neu starten oder außerhalb der MySQL-Umgebung arbeiten muss

1 Stimmen

Ich bin mir nicht sicher, warum, aber ich musste die alte Tabelle löschen und sie dann mit LIKE neu erstellen, anstatt die truncate in der 3. Stufe. Fantastische Lösung.

2 Stimmen

Auch nach dem Abschneiden war meine alte Tabelle beschädigt. Ich habe sie gelöscht und die <neue Tabelle> in <alte Tabelle> umbenannt und alles war wieder in Ordnung, DANKE! Hinweis: einige Zeilen gingen bei der Operation verloren....aber ich vermute, dass es sich dabei um die beschädigten Zeilen handelte, die also wahrscheinlich nicht wiederhergestellt werden können

9voto

jpetazzo Punkte 13872

Die folgende Lösung wurde von Sandros obigem Tipp inspiriert.

Warnung Es hat zwar bei mir funktioniert, aber ich kann nicht sagen, ob es bei Ihnen auch so sein wird.

Mein Problem war das folgende: Lesen einiger bestimmter Zeilen aus einer Tabelle (nennen wir diese Tabelle broken ) würde MySQL zum Absturz bringen. Auch SELECT COUNT(*) FROM broken würde es töten. Ich hoffe, Sie haben eine PRIMARY KEY auf dieser Tabelle (im folgenden Beispiel ist es id ).

  1. Stellen Sie sicher, dass Sie ein Backup oder einen Snapshot des defekten MySQL-Servers haben (nur für den Fall, dass Sie zu Schritt 1 zurückkehren und etwas anderes ausprobieren möchten!)
  2. CREATE TABLE broken_repair LIKE broken;
  3. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
  4. Wiederholen Sie Schritt 3, bis die DB abstürzt (Sie können mit LIMIT 100000 und dann niedrigere Werte verwenden, bis die LIMIT 1 stürzt die DB ab).
  5. Prüfen Sie, ob Sie alles haben (Sie können vergleichen SELECT MAX(id) FROM broken mit der Anzahl der Zeilen in broken_repair ).
  6. Zu diesem Zeitpunkt hatte ich offenbar alle meine Zeilen (außer denen, die wahrscheinlich von InnoDB brutal abgeschnitten wurden). Wenn Sie einige Zeilen vermissen, können Sie versuchen, eine OFFSET zum LIMIT .

Viel Glück!

4voto

freytag Punkte 4564

Hier ist die von MySQL angebotene Lösung: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html

0voto

Ragen Dazs Punkte 2045

Siehe diesen Artikel: http://www.unilogica.com/mysql-innodb-recovery/ (Es ist auf Portugiesisch)

Es wird erklärt, wie man innodb_force_recovery y innodb_file_per_table . Ich entdeckte dies, nachdem ich eine abgestürzte Datenbank mit einer einzigen ibdata1 .

Mit innodb_file_per_table erstellen alle Tabellen in InnoDB eine separate Tabellendatei, wie MyISAM.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X