So sieht die Meldung aus
ERROR 2006 (HY000): MySQL server has gone away
PHP Warning: mysqli::query(): MySQL server has gone away in /var/www/app/db.php on line 42Häufige Ursachen
- Die Verbindung war länger als
wait_timeoutuntätig, der Server hat sie geschlossen, und die App hat die tote Verbindung weiterverwendet, typisch für lang laufende Skripte und Worker. - Eine Abfrage oder Zeile ist größer als
max_allowed_packet, z. B. bei einem großen Import oder einem Blob. - Der Server ist abgestürzt oder wurde neu gestartet, oft vom OOM-Killer beendet, daher sind alle Verbindungen weg.
- Eine Firewall, ein Load Balancer oder ein Proxy trennt untätige Verbindungen früher als die Datenbank.
- Die Verbindung wurde mit
KILLbeendet oder der Server hat ein anderes Limit erreicht.
Prüfen
- Leerlauf-Timeout
mysql -e "SHOW VARIABLES LIKE 'wait_timeout'" - Maximale Paketgröße
mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet'" - Gab es einen Neustart? Laufzeit in Sekunden
mysql -e "SHOW GLOBAL STATUS LIKE 'Uptime'" - Absturz, Kill oder Neustart im Log
Lösung
- Ist
Uptimeklein oder zeigt das Log einen Kill, wurde der Server neu gestartet. Erst klären, warum (Speicher, Absturz). Der Fehler ist nur die Folge. - Bei untätigen Verbindungen: Die App bei diesem Fehler neu verbinden lassen oder die Verbindung vor der Nutzung prüfen (Ping). Pools sollten Verbindungen früher als
wait_timeouterneuern. - Bei großen Abfragen und Importen das Limit am Server anheben, z. B.
max_allowed_packet = 64Min[mysqld], und auch am Client (mysql --max-allowed-packetoder die Einstellung vonmysqldump). Der Wert ist ein Beispiel, richte ihn nach deinen Daten. - Das Leerlauf-Timeout von Firewall oder Proxy mit
wait_timeoutabstimmen oder Keepalives senden. wait_timeoutnicht einfach sehr hoch setzen. Das staut untätige Verbindungen an und führt zu Too many connections.
Häufige Fragen
Warum passiert es nur nach einer langen Pause?
Der Server hat die untätige Verbindung nach wait_timeout geschlossen, und die App hat sie danach benutzt. Die Lösung liegt beim Client: neu verbinden oder erneuern.
Es passiert nur bei großen Importen.
Dann ist das Paket größer als max_allowed_packet. Hebe es an Server und Client an oder teile den Import in kleinere Anweisungen.