:: DEVELOPER ZONE
Alle MySQL-Versionen werden auf vielen Plattformen getestet, bevor sie herausgegeben werden. Das heißt nicht, dass es keinerlei Bugs in MySQL gibt, aber es heißt, dass, wenn es Bugs gibt, diese sehr wenige und schwer zu finden sind. Wenn Sie ein Problem haben, ist es immer hilfreich herauszufinden, was Ihr System zum Absturz bringt, weil Sie dann viel bessere Chancen haben, es schnell zu beheben.
Zunächst sollten Sie versuchen herauszufinden, ob das Problem darin
besteht, dass Ihr mysqld-Daemon stirbt, oder ob Sie ein Problem mit
Ihrem Client haben. Sie können herausfinden, seit wann Ihr
mysqld-Server hochgefahren ist, indem Sie mysqladmin version
ausführen. Wenn mysqld gestorben ist, finden Sie den Grund hierfür
womöglich in der Datei mysql-daten-verzeichnis/`hostname`.err.
See Abschnitt 5.9.1, „Die Fehler-Log-Datei“.
Viele Abstürze von MySQL werden durch beschädigte Index- oder Daten-Dateien
verursacht. MySQL aktualisiert die Daten auf Platte mit dem write()
Systemaufruf, nach jedem SQL-Statement und bevor der Client über das
Ergebnis unterrichtet wird. (Das gilt nicht, wenn Sie mit
delayed_key_writes fahren, denn in diesem Fall werden nur die Daten
geschrieben.) Das bedeutet, dass die Daten sicher sind, selbst wenn
mysqld abstürzt, weil das Betriebssystem sicherstellt, dass die
nicht von MySQL zurückgeschriebenen Daten (flush) auf Platte
zurückgeschrieben werden. Sie können MySQL zwingen, alles nach jedem
SQL-Befehl auf Platte zurückzusynchronisieren, indem Sie mysqld mit
--flush starten.
Das Gesagte bedeutet, dass Sie normalerweise keine beschädigten Tabellen erhalten sollten, ausser in folgenden Fällen:
Jemand oder etwas killte mysqld oder die Maschine mitten während
einer Aktualisierung.
Sie haben einen Bug in mysqld gefunden, der dazu führte, dass er
mitten während einer Aktualisierung starb.
Jemand manipuliert die Daten- / Index-Dateien ausserhalb von mysqld, ohne die Tabelle korrekt zu sperren.
Wenn Sie viele mysqld-Server auf denselben Daten auf einem System
laufen lassen, das Dateisystem-Sperren nicht gut unterstützt (das wird
normalerweise vom lockd-Daemon gehandhabt) oder wenn Sie mehrere
Server mit --skip-locking fahren.
Wenn Sie eine beschädigte Index- / Daten-Datei haben, die sehr falsche
Daten enthält, die mysqld durcheinander brachten.
Sie haben einen Bug im Datenspeicher-Code gefunden. Das ist nicht sehr
wahrscheinlich, aber zumindest möglich. In diesem Fall können Sie
versuchen, den Dateityp auf einen anderen Datenbank-Handler umzustellen,
indem Sie ALTER TABLE auf eine reparierte Kopie der Tabelle
anwenden!
Weil es sehr schwierig ist herauszufinden, warum etwas abstürzt, versuchen Sie zuerst herauszufinden, ob Dinge, die bei anderen funktionieren, bei Ihnen abstürzen, oder ob das nicht der Fall ist. Versuchen Sie bitte folgendes:
Fahren Sie den mysqld-Daemon mit mysqladmin shutdown herunter
und führen Sie myisamchk --silent --force */*.MYI auf alle Tabellen
aus. Starten Sie den mysqld-Daemon erneut. Das stellt sicher, dass
Sie von einem sauberen Ausgangszustand aus fahren.
See Kapitel 5, MySQL-Datenbankadministration.
Benutzen Sie mysqld --log und versuchen Sie den Informationen im Log
zu entnehmen, ob eine bestimmte Anfrage den Server killt oder nicht. Etwa
95% aller Bugs beziehen sich auf eine bestimmte Anfrage! Normalerweise ist
das eine der letzten Anfragen in der Log-Datei, direkt bevor MySQL neu
startete. See Abschnitt 5.9.2, „Die allgemeine Anfragen-Log-Datei“. Wenn Sie MySQL wiederholt mit einer
der Anfragen killen, selbst wenn Sie alle Tabellen direkt vor der
Ausführung der Anfrage überprüft haben, haben Sie den Bug eingegrenzt und
sollten dafür einen Bug-Bericht schreiben! See Abschnitt 2.6.2.3, „Wie man Bugs oder Probleme berichtet“.
Versuchen Sie, einen Testfall herzustellen, den wir zur Reproduzierung des Problems verwenden können. See Abschnitt D.1.6, „Einen Testfall herstellen, wenn Sie Tabellenbeschädigung feststellen“.
Versuchen Sie, die beigefügten mysql-test test und MySQL-Benchmarks laufen
zu lassen. See Abschnitt 10.3.2, „MySQL-Test-Suite“. Sie können MySQL recht gut prüfen. Sie
können den Benchmarks auch selbst Code hinzufügen, der Ihre Applikation
simuliert! Die Benchmarks finden sich im bench-Verzeichnis in der
Quelldistribution oder bei einer Binärdistribution im
sql-bench-Verzeichnis unter Ihrem MySQL-Installationsverzeichnis.
Probieren Sie fork_test.pl und fork2_test.pl.
Wenn Sie MySQL zum Debuggen konfigurieren, ist es wesentlich einfacher,
Informationen über mögliche Fehler zu erhalten, wenn etwas schief geht.
Konfigurieren Sie MySQL mit der --with-debug-Option oder mit der
--with-debug=full-Option für configure neu und kompilieren
Sie neu. See Abschnitt D.1, „Einen MySQL-Server debuggen“.
Wenn MySQL zum Debuggen konfiguriert wird, wird ein sicherer Speicher-Zuweiser (Memory Allocator) hinzugefügt, der einige Fehler finden kann. Ausserdem erfolgen etliche Ausgaben über das, was gerade geschieht.
Haben Sie die neuesten Patches für Ihr Betriebssystem installiert?
Benutzen Sie die --skip-locking-Option für mysqld. Auf
manchen Systemen arbeitet der lockd-Sperrmanager nicht korrekt. Die
--skip-locking-Option weist mysqld an, keine externen Sperren
zu benutzen. (Das heißt, dass Sie nicht zwei mysqld-Server auf
denselben Daten laufen lassen können und dass Sie vorsichtig sein müssen,
wenn Sie myisamchk benutzen, aber es kann aufschlussreich sein, die
Option testweise zu benutzen.)
Haben Sie mysqladmin -u root processlist ausprobiert, wenn
mysqld zu laufen scheint, aber nicht antwortet? Manchmal ist
mysqld nicht komatös, obwohl es so aussieht. Das Problem kann darin
bestehen, dass alle Verbindungen in Benutzung sind, oder es kann ein
internes Sperrproblem vorliegen. mysqladmin processlist ist
üblicherweise in der Lage, in solchen Fällen eine Verbindung aufzubauen und
kann nützliche Informationen über die momentane Anzahl von Verbindungen und
ihren Status liefern.
Lassen Sie den Befehl mysqladmin -i 5 status oder mysqladmin -i 5 -r status in einem separaten Fenster laufen, um statistische
Informationen auszugeben, während Sie Ihre anderen Anfragen laufen lassen.
Versuchen Sie folgendes:
Starten Sie mysqld von gdb aus (oder in einem anderen
Debugger).
See Abschnitt D.1.3, „mysqld unter gdb debuggen“.
Lassen Sie Ihre Test-Skripts laufen.
Geben Sie die Ablaufverfolgung (Backtrace) und die lokalen Variablen der
untersten 3 Ebenen aus. In gdb können Sie das mit folgenden Befehle tun,
wenn mysqld innerhalb von gdb abgestürzt ist:
backtrace info local up info local up info local
Mit gdb können Sie auch untersuchen, welchen Thread es gibt (mit info thread und zu einem speziellen Thread umschalten (mit thread #,
wobei # die Thread-Kennung ist).
Versuchen Sie, Ihre Applikation mit einem Perl-Skript zu simulieren, um MySQL zu zwingen, abzustürzen oder fehlerhaftes Verhalten an den Tag zu legen.
Senden Sie einen normalen Bug-Bericht. See Abschnitt 2.6.2.3, „Wie man Bugs oder Probleme berichtet“. Geben Sie mehr Details an als üblich. Weil MySQL bei vielen Leuten funktioniert, kann es sein, dass der Absturz das Ergebnis von etwas ist, das nur auf Ihrem Computer existiert (beispielsweise ein Fehler, der aus Ihren besonderen Systembibliotheken resultiert).
Wenn Sie ein Problem mit Tabellen haben, die Zeilen dynamischer Länge
enthalten, und Sie nicht BLOB/TEXT-Spalten benutzen (sondern nur
VARCHAR-Spalten), können Sie versuchen, alle VARCHAR- in
CHAR-Spalten umzuwandeln, indem Sie ALTER TABLE verwenden.
Das erzwingt, dass MySQL Zeilen fester Länge verwendet. Zeilen fester Länge
benötigen etwas mehr Platz, sind aber fehlertoleranter gegenüber
Beschädigungen!
Der aktuelle Code mit dynamischen Zeilen ist bei MySQL AB seit mindestens drei Jahren ohne jedes Problem in Benutzung, aber naturgemäß sind Zeilen dynamischer Länge fehleranfälliger. Daher kann es eine gute Idee sein, das oben Gesagte auszuprobieren.
© 1995-2005 MySQL AB. All rights reserved.
