GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Reparieren von MySQL InnoDB-Datenbanken

Einführung:
Dieser Beitrag ist eine Kopie des wunderbaren folgenden Beitrags:
https://blackbird.si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/https://blackbird .si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/

Hier sind einige wichtige Übungen daraus:

MySQL – Wiederherstellung beschädigter InnoDB-Tabellen – Schritt-für-Schritt-Anleitung

Gepostet in Datenbanken von Alen Krmelj am 19. März 2013, 5-6 Minuten

InnoDB-Tabellen werden nicht leicht beschädigt, aber wenn sie es tun, geschieht dies normalerweise aufgrund von Hardwareproblemen, Stromausfällen oder MySQL-Fehlern. Es hinterlässt beschädigte Seiten im InnoDB-Tablespace und die Wiederherstellung davon könnte ein Problem darstellen. Wenn Ihr MySQL ordnungsgemäß abstürzt und nicht zurückkehren möchte, sehen Sie möglicherweise eine Schleife eines ähnlichen Fehlers:

InnoDB:Behauptungsfehler in Thread 1129654592 in Datei ibuf0ibuf.c Zeile 4231InnoDB:Fehlerhafte Behauptung:page_get_n_recs(page)> 1InnoDB:Wir erzeugen absichtlich eine Speicherfalle.InnoDB:Senden Sie einen detaillierten Fehlerbericht an http://bugs.mysql .com.InnoDB:Wenn Sie wiederholt Assertion-Fehler oder -Abstürze bekommen, sogar InnoDB:unmittelbar nach dem Start von mysqld, kann es zu InnoDB:-Beschädigungen im InnoDB-Tablespace kommen. Bitte beziehen Sie sich auf InnoDB:http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.htmlInnoDB:about forceing recovery.mysqld got signal 6;Dies könnte daran liegen, dass Sie auf einen Fehler gestoßen sind. Es ist auch möglich, dass diese Binärdatei oder eine der Bibliotheken, mit denen sie verknüpft wurde, beschädigt, falsch erstellt oder falsch konfiguriert ist. Dieser Fehler kann auch durch eine fehlerhafte Hardware verursacht werden. Wir werden unser Bestes tun, um einige Informationen zusammenzukratzen, die hoffentlich helfen, das Problem zu diagnostizieren, aber da wir bereits abgestürzt sind, stimmt definitiv etwas nicht und dies kann fehlschlagen ... einige Backtrace ... Die Handbuchseite unter http://dev.mysql.com/doc/mysql/en/crashing.html enthält Informationen, die Ihnen helfen sollten, herauszufinden, was den Absturz verursacht 

Wiederherstellung von beschädigten InnoDB-Tabellen

Schritt 1 – Bringen Sie Ihre Datenbank in den Wiederherstellungsmodus

Sie sollten Ihre Datenbank herunterfahren. Beenden Sie es, falls es noch läuft und diese Nachrichten in Ihrem Protokoll spammt. Als letzten Ausweg können Sie den Prozess auch beenden. Um Ihre Datenbank wiederherzustellen, müssen Sie sie im Wiederherstellungsmodus mit innodb_force_recovery starten . Sie sollten wissen, dass dieser Wiederherstellungsmodus Ihre Datenbanken schreibgeschützt macht. Benutzer, die sich damit verbinden, können vorhandene Daten nicht aktualisieren, einfügen oder auf andere Weise ändern. Um zu verhindern, dass Ihr MySQL in der Sekunde, in der es zurückkommt, gehämmert wird, schlage ich vor, dass Sie auch den Port des MySQL-Servers von 3306 auf etwas Zufälliges ändern. Fügen Sie innodb_force_recovery=1 hinzu zu Ihrer my.cnf Falls Ihr Server nicht zurückkehren möchte, können Sie diese Zahl weiter von 1 auf 6 erhöhen, sehen Sie im MySQL-Handbuch nach, um zu sehen, was die Unterschiede sind.

Achten Sie darauf, Ihre MySQL-Protokolle zu überprüfen, und ob es Schleifen mit etwas wie:

InnoDB: Waiting for the background threads to start

Sie sollten auch innodb_purge_threads=0 hinzufügen zu Ihrer my.cnf .

Um also die Datenbank zurückzubringen, musste ich diese 3 Parameter in my.cnf hinzufügen :

port =8881innodb_force_recovery=3innodb_purge_threads=0

Schritt 2 – Überprüfen Sie, welche Tabellen beschädigt sind, und erstellen Sie eine Liste

Jetzt haben Sie Ihre Datenbank gesichert und ausgeführt, aber im Wiederherstellungsmodus. Sie können Ihre Datenbanken / Tabellen nicht ändern. Wenn Sie es versuchen, erhalten Sie eine Fehlermeldung:

Got error -1 from storage engine

Wir müssen herausfinden, welche Tabellen beschädigt wurden. Dazu führen wir Folgendes aus:mysqlcheck --all-databases

Suchen Sie nach Zeilen, in denen steht, dass die Tabelle beschädigt ist. Notieren Sie alle Tabellen / Datenbanken, die Ihnen einen Fehler gebracht haben. Sie müssen mysqldump ausführen sie im Wiederherstellungsmodus und importieren Sie sie erneut, nachdem Sie wieder in den normalen MySQL-Modus gebootet haben. Ich möchte Sie auch daran erinnern, dass innochecksum Befehl hat mir nicht dabei geholfen, herauszufinden, welche Tabellen beschädigt sind, also stören Sie sich nicht daran.

Schritt 3 – Sichern und löschen Sie Ihre beschädigten Tabellen

Sobald Sie die Liste der beschädigten Tabellen erhalten haben, sollten Sie sie mit mysqldump in ihre eigenen .sql-Dateien umwandeln, damit Sie eine Sicherung für den erneuten Import haben. Falls Sie sich gefragt haben, wie Sie nur eine Tabelle in der Datenbank sichern können:

mysqldump my_database table> database.table.sql

Nachdem Sie die Sicherung erstellt haben, löschen Sie Ihre beschädigten Tabellen, indem Sie Folgendes ausführen:drop table database.table; aus Ihrer MySQL-Shell. Sie haben Ihre MySQL-Datenbank jetzt bereinigt, also ist es an der Zeit, sie ohne Wiederherstellungsmodus wieder hochzufahren.

Schritt 4 – Starten Sie MySQL im normalen Modus neu

Wenn wir keine beschädigten Tabellen mehr in unserer Datenbank haben, sollten wir die my.cnf-Einstellungen entfernen, die wir in Schritt 1 hinzugefügt haben. Entfernen Sie die Port-Einstellung noch nicht, da Ihrer Datenbank noch Tabellen fehlen, die Sie gesichert haben und die Sie benötigen reimportiert werden. Starten Sie Ihr MySQL neu.

Schritt 5 – Backup-.sql importieren

Importieren Sie jede gedumpte .sql-Tabelle in ihre respektierte Datenbank. Um dies über die CLI zu tun:

mysql-Datenbank  

Schritt 6 – Wechseln Sie den Hafen und holen Sie sich ein Bier

Nachdem Sie Ihre Tabellen importiert haben, können Sie die Porteinstellungen in Ihrer my.cnf ändern . Natürlich danach MySQL neu starten. Es sollte zurückkommen und wieder funktionieren wie vor dem Absturz. Holen Sie sich ein Bier und klicken Sie auf den Anfang dieses Beitrags, um mich wissen zu lassen, dass dieser Artikel Ihnen bei der Lösung Ihres Problems geholfen hat.


Linux
  1. So kopieren Sie MySQL-Tabellen zwischen Datenbanken

  2. MySQL – Konvertieren in Tabellendaten für InnoDB

  3. Inkrementelle MySQL-Sicherung – Point-in-Time-Sicherung und -Wiederherstellung von InnoDB- und MyIsam-Datenbanken

  4. Beim Aktualisieren von MariaDB auf v10.2.35 oder v10.3.26 werden MySQL-Datenbanken in cPanel als offline angezeigt.

  5. Arbeiten mit cPanel MySQL-Datenbanken

So importieren und exportieren Sie MySQL-Datenbanken unter Linux

So zeigen Sie eine Liste aller Datenbanken in MySQL an

So sichern Sie alle MySQL-Datenbanken über die Befehlszeile

So zeigen Sie alle Datenbanken auf MySQL auf

So erstellen und ändern Sie MySQL-Datenbanken in cPanel

So lösen Sie InnoDB:Mysql-Fehler „./ibdata1“ kann nicht gesperrt werden?