In diesem Abschnitt wird auch der hiermit verwandte
Lost connection to server during query
-Fehler
behandelt.
Die häufigste Ursache eines MySQL server has gone
away
-Fehlers ist, dass der Server die Verbindung wegen
eines Timeouts geschlossen hat. In diesem Fall wird
normalerweise einer der folgenden Fehlercodes (je nach
Betriebssystem) gemeldet:
Fehlercode | Beschreibung |
CR_SERVER_GONE_ERROR |
Der Client konnte keine Frage an den Server senden. |
CR_SERVER_LOST |
Der Client konnte zwar ohne Fehler auf den Server schreiben, erhielt aber keine (oder keine vollständige) Antwort auf die Frage. |
Nach Voreinstellung schließt der Server die Verbindung, wenn
nichts geschieht, nach acht Stunden. Dieses Zeitlimit können
Sie in der Variablen wait_timeout
ändern,
wenn Sie mysqld starten. Siehe
Abschnitt 5.2.2, „Server-Systemvariablen“.
Wenn Sie ein Skript verwenden, müssen Sie die Anfrage nur
erneut absetzen, damit der Client sich automatisch erneut
verbindet. Das setzt voraus, dass die automatische Neuverbindung
im Client eingeschaltet ist (was beim
mysql
-Kommandozeilen-Client standardmäßig
der Fall ist).
Oft kommen MySQL server has gone away
-Fehler
auch aus folgenden Gründen zustande:
Sie (oder der Datenbankadministrator) haben den laufenden
Thread mit einer KILL
-Anweisung oder
einem mysqladmin kill-Befehl angehalten.
Sie haben versucht, eine Anfrage nach dem Schließen der Serververbindung abzusetzen. Dies weist auf einen Fehler in der Anwendungslogik hin, der korrigiert werden muss.
Sie haben einen Timeout von der TCP/IP-Verbindung auf der
Clientseite erhalten. Dazu kann es bei folgenden Befehlen
kommen: mysql_options(..., MYSQL_OPT_READ_TIMEOUT,
...)
oder mysql_options(...,
MYSQL_OPT_WRITE_TIMEOUT, ...)
. In diesem Fall
können Sie Ihr Problem lösen, indem Sie den Timeout
heraufsetzen.
Sie haben einen Timeout auf der Serverseite und die
automatische Neuverbindung ist im Client deaktiviert worden
(das Flag reconnect
in der
MYSQL
-Struktur ist gleich 0).
Sie verwenden einen Windows-Client und der Server hat die
Verbindung beendet (wahrscheinlich, weil
wait_timeout
abgelaufen ist), bevor der
Befehl gegeben wurde.
Das Problem mit Windows besteht darin, dass MySQL manchmal keinen Fehler vom Betriebssystem gemeldet bekommt, wenn es Daten in die TCP/IP-Verbindung mit dem Server schreibt. Stattdessen wird der Fehler erst bei dem Versuch gemeldet, Daten aus dieser Verbindung zu lesen.
Selbst wenn das Flag reconnect
in der
MYSQL
-Struktur gleich 1 ist, wird sich
MySQL in diesem Fall nicht automatisch neu verbinden und die
Anfrage neu absetzen, da es nicht wissen kann, ob der Server
die ursprüngliche Anfrage bekommen hat oder nicht.
Die Lösung ist entweder ein mysql_ping
auf der Verbindung, falls seit der letzten Abfrage viel Zeit
vergangen ist (so handelt auch MyODBC
),
oder eine Änderung von wait_timeout
auf
dem mysqld-Server auf einen Wert, der so
hoch ist, dass es praktisch nie zu einem Timeout kommt.
Solche Fehlermeldungen können Sie auch erhalten, wenn Sie
an den Server eine zu große oder eine falsche Anfrage
senden. Wenn mysqld ein Paket empfängt,
das zu groß oder nicht ordnungsgemäß ist, nimmt das
Programm an, dass mit dem Client etwas nicht stimmt, und
schließt die Verbindung. Wenn Sie große Anfragen
benötigen (zum Beispiel weil Sie mit umfangreichen
BLOB
-Spalten arbeiten), können Sie das
Limit pro Anfrage heraufsetzen, indem Sie die Servervariable
max_allowed_packet
von ihrem Standardwert
1 Mbyte auf etwas Höheres heraufsetzen. Vielleicht müssen
Sie auch die Paketgröße auf der Clientseite erhöhen.
Über die Einstellung der Paketgröße können Sie unter
Abschnitt A.2.9, „Packet too large
-Fehler“, mehr erfahren.
Ihre Verbindung wird auch abbrechen, wenn Sie ein Paket der Größe 16 Mbyte oder mehr verschicken und Ihr Client älter als Version 4.0.8 ist, während Ihr Server die Version 4.0.8 oder höher verwendet (oder umgekehrt).
Eventuell kommt es auch zu dem Fehler MySQL server
has gone away
, wenn MySQL mit der Option
--skip-networking
gestartet wird.
Während der Ausführung der Anfrage trat ein Fehler auf, der den Server angehalten hat.
Ob der MySQL Server abgestürzt und wieder hochgefahren ist, erfahren Sie, indem Sie mysqladmin version ausführen und auf die Uptime des Servers achten. Wenn die Clientverbindung unterbrochen war, weil mysqld abgestürzt und wieder hochgefahren ist, sollten Sie sich auf die Erforschung der Absturzursachen konzentrieren. Zuerst prüfen Sie, ob der Server bei derselben Anfrage erneut abstürzen wird. Siehe Abschnitt A.4.2, „Was zu tun ist, wenn MySQL andauernd abstürzt“.
Mehr Informationen über unterbrochene Verbindungen bekommen
Sie, wenn Sie mysqld mit der Option
--log-warnings=2
starten. Damit werden einige
Verbindungsabbruchfehler in der Datei
hostname.err
protokolliert. Siehe
Abschnitt 5.12.1, „Die Fehler-Logdatei“.
Wenn Sie einen Bugreport über dieses Problem schicken möchten, senden Sie uns bitte auch folgende Informationen:
Angabe, ob der MySQL Server abgestürzt ist. Dies erfahren Sie aus dem Fehlerlog des Servers. Siehe Abschnitt A.4.2, „Was zu tun ist, wenn MySQL andauernd abstürzt“.
Wenn eine bestimmte Anfrage mysqld
anhält und die beteiligten Tabellen mit CHECK
TABLE
vor Ausführung dieser Anfrage überprüft
wurden: Können Sie dann einen reproduzierbaren Testfall
herstellen? Siehe Abschnitt E.1.6, „Erzeugen eines Testfalls, wenn Sie Tabellenbeschädigung feststellen“.
Welchen Wert hat die Systemvariable
wait_timeout
im MySQL Server? (Mit
mysqladmin variables erhalten Sie den
Wert dieser Variablen.)
Haben Sie versucht, mysqld mit der Option
--log
auszuführen, um festzustellen, ob
die Problemanfrage im Log auftaucht?
Siehe auch Abschnitt A.2.10, „Kommunikationsfehler/abgebrochene Verbindung“, und Abschnitt 1.8, „Wie man Bugs oder Probleme meldet“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.