Wie erkennen Sie eine Beschädigung der InnoDB-Tabelle?

24

Ich habe einige Tabellen, die partitioniert sind und mehrere Indizes für einen replizierten Slave haben. Nach dem Kopieren des Snapshots (als sicher eingestuft) auf einen neuen Slave und dem Upgrade von mysqld von 5.1.42 auf 5.5.15 und dem Neustart der Replikation stürzt InnoDB mit der Fehlermeldung "Invalid pointer ..." ab.

Diese Fehler sind auf 2 Servern mit unterschiedlicher Hardware und Betriebssystem aufgetreten. Nach dem Rennen:

ALTER TABLE .... COALESCE PARTION n;

Das Problem für diesen Tisch ist behoben.

Meine Frage ist jedoch umfangreicher und lautet: "Woran erkennt man eine Beschädigung der InnoDB-Tabelle?" oder umformuliert: "Wie beurteilen Sie den Zustand der InnoDB-Tabelle?" Ist "CHECK TABLE" das einzige verfügbare Tool, um Probleme vor dem Absturz zu identifizieren?

Nicht sicher, ob es wichtig ist, aber die Abstürze sind aufgetreten: Version: '5.5.15-55-log' Socket: '/opt/mysql.sock' Port: 3306 Percona Server (GPL), Release rel21.0, Revision 158

randomx
quelle
2
Hallo Randy! Ich halte die Antworten hier für glaubwürdig - InnoDB hat eine eigene Korruption festgestellt. Vielleicht sollten Sie Ihre Frage umformulieren, warum InnoDB durch Ihre Vorgehensweise beschädigt wird.
Morgan Tocker

Antworten:

18

Morgan gibt in seinem Kommentar einen Hinweis darauf, dass InnoDB ständig nach beschädigten Seiten sucht, indem es die gelesenen Seiten mit Prüfsummen überprüft. Wenn InnoDB eine nicht übereinstimmende Prüfsumme findet, stürzt der Server ab.

Wenn Sie diesen Vorgang beschleunigen möchten (anstatt darauf zu warten, dass InnoDB die beschädigte Seite liest), können Sie Folgendes verwenden innochecksum:

Da Unstimmigkeiten bei der Prüfsumme dazu führen, dass InnoDB einen ausgeführten Server absichtlich herunterfährt, kann es vorzuziehen sein, dieses Tool zu verwenden, anstatt darauf zu warten, dass ein Server in der Produktionsauslastung auf die beschädigten Seiten stößt.

Eine interessante Einschränkung:

innochecksum kann nicht für Tablespace-Dateien verwendet werden, die der Server bereits geöffnet hat. Für solche Dateien sollten Sie CHECK TABLE verwenden, um Tabellen im Tablespace zu überprüfen.

Also ja, für eine Online-Tabelle CHECK TABLEist das wahrscheinlich das Werkzeug (oder wie in einer anderen Antwort ausgeführt, mysqlcheck wenn Sie mehr als eine einzelne Datenbank gleichzeitig ausführen möchten).

Wenn Sie Ihre Datenbank herunterfahren können, können Sie die Prüfsummen mit erzwingen innochecksum

Anekdote : Bei einem Innodb-Tablespace von 29 GB (mit innodb_file_per_table=1) dauerte dieses Skript etwa 2 Minuten

#!/bin/bash
for i in $(ls /var/lib/mysql/*/*.ibd)
do
  innochecksum -v $i
done

Als Bonus wurde jedoch eine neue Methode für die schnelle Innodb-Prüfsumme implementiert, da Sie Percona ausführen . Ich habe es nie benutzt, aber es könnte den Prozess beschleunigen.

Derek Downey
quelle
1
Werde es hier versuchen, scheint die Lösung zu sein. @Randymelder sucht nach +1
marcio
2
Percona-Server hat einige andere nette Funktionen. Siehe innodb_corrupt_table_action percona.com/doc/percona-server/5.5/reliability/… (!!)
Morgan Tocker
@DTest: innochecksum ist der richtige Weg. Das ist ein Hüter. +1 !!!
RolandoMySQLDBA
@DTest: Hut ab heute auf diesem !!!
RolandoMySQLDBA
@MorganTocker Interessant. Ich werde mein Wissen vakuumieren und etwas über Percona recherchieren müssen
Derek Downey
6

WARNUNG: Bevor Sie eine dieser Anweisungen ausführen, wird dringend empfohlen, zu überprüfen, ob eine ordnungsgemäße Sicherung Ihrer Datenbank in Händen ist, nur für den Fall. (Danke an @Nick für die Warnung)

Versuchen Sie, den mysqlcheckBefehl zu verwenden. Auf einem Terminal:

mysqlcheck -u username -p --databases database1 database2

Dieser Befehl gibt eine Liste aller Tabellen und einen Status aus, der Sie darüber informiert, ob eine Beschädigung vorliegt:

table1  OK
table2  OK
table3  OK
tableN  OK

Damit wissen Sie bereits, welche Tische Sie reparieren müssen. Nur für den Fall, dass Sie alles auf einmal reparieren möchten:

mysqlcheck -u username -p --auto-repair --databases database1 database2 

Weitere Informationen finden Sie untermysqlcheck : http://dev.mysql.com/doc/refman/5.0/de/mysqlcheck.html

Hinweis: Sie haben Ihre Frage mit . Ich hatte keine Ahnung, was das war, also googelte ich. Es scheint ein Fork von MySQL zu sein, aber ich habe keinen Grund zu der Annahme, dass die Befehle inkompatibel sind (Daumen drücken).


Jemand hat mich auf dieses Handbuch hingewiesen, das spezifischere Anweisungen zur Wiederherstellung der InnoDB-Datenbank für kritischere Situationen enthält, in denen nicht die gesamte Datenbank gestartet wird: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -Datenbank-myisam-innodb-1634.html

marcio
quelle
1
mysqlcheck ist ein Synonym für 'check table ...' -1
randomx
Nicht wahr. Erstens ist mysqlcheck ein Befehlszeilendienstprogramm und CHECK TABLE eine SQL-Anweisung (ein Vergleich zwischen Orange und Lemmons). Außerdem können Sie mit CHECK TABLE KEINE vollständige Datenbank überprüfen, ohne ALLE Tabellennamen in die SQL-Anweisung aufzunehmen ( es wäre auch nicht sehr produktiv)
marcio
Und mysqlcheck hat die Option --auto-repair die Tabellen, die beschädigt sind, während CHECK TABLE nur prüft, ob die Tabellen beschädigt sind oder nicht, aber keine Reparatur durchführen kann.
Marcio
2
@randymelder - Sie sagen zu Unrecht, dass mysqlcheck ein Synonym für ist CHECK TABLE. Die Dokumentation , die Sie zu den Zuständen verknüpft: " mysqlchecknutzt die SQL - Anweisungen CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, und OPTIMIZE TABLEauf bequeme Weise für den Benutzer Es legt fest , welche Angaben zu Verwendung für den Betrieb Sie ausführen möchten, und sendet dann die Anweisungen an den Server ausgeführt werden.. " Das ist kein Synonym; Das ist eine Benutzeroberfläche für eine Sammlung von Anweisungen.
Nick Chammas
6

Gemäß dem MySQL 5.0-Leitfaden für Zertifizierungsstudien, Abschnitt 30.4 :

Sie können InnoDB-Tabellen mit dem Befehl CHECK TABLE oder mit einem Client-Programm überprüfen, um die Anweisung für Sie auszugeben. Wenn eine InnoDB-Tabelle Probleme aufweist, können Sie sie nicht mit REPAIR TABLE beheben, da diese Anweisung nur für MyISAM gilt.

Wenn eine Tabellenprüfung anzeigt, dass eine InnoDB-Tabelle Probleme hat, sollten Sie in der Lage sein, den konsistenten Zustand der Tabelle wiederherzustellen, indem Sie sie mit mysqldump sichern, löschen und von diesem Speicherauszug neu erstellen.

Bei einem Absturz eines MySQL-Servers oder des Hosts, auf dem er ausgeführt wird, müssen möglicherweise einige InnoDB-Tabellen repariert werden. Normalerweise reicht es aus, den Server einfach neu zu starten, da die InnoDB-Speicher-Engine im Rahmen ihrer Startsequenz eine automatische Wiederherstellung durchführt. In seltenen Fällen startet der Server möglicherweise nicht, da die automatische Wiederherstellung von InnoDB fehlgeschlagen ist. In diesem Fall gehen Sie wie folgt vor:

  • Starten Sie den Server mit der Option --innodb_force_recovery neu, die auf einen Wert im Bereich von 1 bis 6 festgelegt ist. Diese Werte weisen auf zunehmende Vorsicht bei der Vermeidung eines Absturzes und eine zunehmende Toleranz für mögliche Inkonsistenzen in den wiederhergestellten Tabellen hin. Ein guter Anfangswert ist 4.

  • Wenn Sie den Server mit --innodb_force_recovery auf einen Wert ungleich Null starten, behandelt InnoDB den Tablespace als schreibgeschützt. Aus diesem Grund sollten Sie die InnoDB-Tabellen mit mysqldump sichern und sie dann löschen, solange die Option aktiviert ist. Starten Sie dann den Server ohne die Option --innodb_force_recovery neu. Stellen Sie beim Hochfahren des Servers die InnoDB-Tabellen aus den Sicherungsdateien wieder her.

  • Wenn die vorhergehenden Schritte fehlschlagen, müssen die InnoDB-Tabellen aus einer vorherigen Sicherung wiederhergestellt werden.

Bitte lesen Sie die MySQL-Dokumentation zu InnoDB Forced Recovery  

RolandoMySQLDBA
quelle
3
FWIW, der Zertifizierungsleitfaden hat eine sehr politisch korrekte Antwort :) Wenn Sie TABLE in einer InnoDB-Tabelle PRÜFEN und sie tatsächlich beschädigt ist, wird sie niemals als "korrupt" zurückgegeben, sondern den Server zum Absturz bringen. Die Anweisung ist in InnoDB fast veraltet, da jedes Mal, wenn Sie InnoDB-Seiten lesen, auf Korruption geprüft wird (über Seitenprüfsummen).
Morgan Tocker
2

Ich frage mich, was passiert, wenn jemand InnoDB-Daten verwendet, die mit dem InnoDB-Plugin erstellt wurden, und dann auf eine andere Version von InnoDB wechselt. Dies könnte in den Augen von mysqld zu einer möglichen Seitenbeschädigung führen.

Beachten Sie, was die MySQL-Dokumentation zum InnoDB-Dateiformat über diese Möglichkeit aussagt:

Im Allgemeinen kann eine neuere Version von InnoDB eine Tabelle oder einen Index erstellen, die oder der mit einer früheren Version von InnoDB nicht sicher gelesen oder geschrieben werden kann, ohne dass das Risiko von Abstürzen, Hängen, falschen Ergebnissen oder Beschädigungen besteht. Das InnoDB-Plugin bietet einen neuen Mechanismus zum Schutz vor diesen Bedingungen und zur Wahrung der Kompatibilität zwischen Datenbankdateien und Versionen von InnoDB.

Ich würde die Daten auf dem Slave verschrotten. Tatsächlich würde ich nur brachiale Gewalt anwenden, indem ich einen logischen Speicherauszug (mysqldump) der Daten erhalte:

  • Löschen Sie alle Datenbanken mit InnoDB auf dem Slave
  • Fahren Sie MySQL auf dem Slave herunter
  • Löschen Sie ibdata1, ib_logfile0 und ib_logfile1 auf dem Slave
  • Starten Sie mysql auf dem Slave und lassen Sie ibdata1, ib_logfile0 und ib_logfile1 neu erstellen
  • mysqldump die Daten vom Master in den Slave

Meine ursprünglich gepostete Antwort gilt als "alte Schule". In diesem Fall würde ich auf jeden Fall die Dateiformate untersuchen, die von .ibd und / oder ibdata1 verwendet werden.

RolandoMySQLDBA
quelle