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

.
War es hilfreich?

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).

  1. 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!)
  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 er die DB abstürzt (können Sie LIMIT 100000 verwenden und dann niedrigere Werte verwenden, bis mit LIMIT 1 stürzt die DB).
  5. Sehen Sie, wenn Sie alles haben (Sie SELECT MAX(id) FROM broken mit der Anzahl der Zeilen in broken_repair vergleichen kann).
  6. 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 zum LIMIT versuchen hinzuzufügen.

Viel Glück!

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top