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
quelle
Antworten:
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ürztder 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
:Eine interessante Einschränkung:
Also ja, für eine Online-Tabelle
CHECK TABLE
ist 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 MinutenAls 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.
quelle
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
mysqlcheck
Befehl zu verwenden. Auf einem Terminal:Dieser Befehl gibt eine Liste aller Tabellen und einen Status aus, der Sie darüber informiert, ob eine Beschädigung vorliegt:
Damit wissen Sie bereits, welche Tische Sie reparieren müssen. Nur für den Fall, dass Sie alles auf einmal reparieren möchten:
Weitere Informationen finden Sie unter
mysqlcheck
: http://dev.mysql.com/doc/refman/5.0/de/mysqlcheck.htmlHinweis: Sie haben Ihre Frage mit percona markiert . 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
quelle
CHECK TABLE
. Die Dokumentation , die Sie zu den Zuständen verknüpft: "mysqlcheck
nutzt die SQL - AnweisungenCHECK TABLE
,REPAIR TABLE
,ANALYZE TABLE
, undOPTIMIZE TABLE
auf 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.Gemäß dem MySQL 5.0-Leitfaden für Zertifizierungsstudien, Abschnitt 30.4 :
Bitte lesen Sie die MySQL-Dokumentation zu InnoDB Forced Recovery
quelle
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:
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:
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.
quelle