NeuBlack Friday – 50 % Rabatt auf die erste Zahlung
WordPress-Fehlerbehebung

MySQL Server ist weg

WordPress hatte eine funktionierende Datenbankverbindung und verlor sie mitten in der Anfrage. Die Abfrage ist selten fehlerhaft; die Verbindung ist es.

WordPress database error MySQL server has gone away for query …

Kurzantwort

Drei Dinge lassen eine Live-Verbindung fallen: eine Abfrage größer als max_allowed_packet, eine Leerlaufphase länger als wait_timeout oder MySQL-Neustart. Überprüfen Sie, ob der Server länger als die Site war, da eine niedrige Betriebszeit die Frage sofort beantwortet und die anderen beiden nicht getestet werden müssen.

Diagnose

Die wahrscheinlichsten Ursachen zuerst.

Gehen Sie die Liste der Reihe nach durch. Prüfen Sie jede Ursache, bevor Sie etwas ändern, da die Lösungen unterschiedlich sind und eine Vermutung mehr Zeit kostet als ein Befehl.

UrsacheSo prüfen Sie esLösung
Eine Abfrage größer als max_allowed_packetDer Fehler folgt einem großen Import, einem Post mit einem sehr großen serialisierten Metawert oder einer Backup-Wiederherstellung - und er scheitert jedes Mal am selben Punkt und nicht zufällig.Erheben Sie max_allowed_packet auf dem Server, um die größte einzelne Anweisung bequem zu überschreiten. Dies ist eine serverseitige Decke, so dass eine clientseitige Einstellung sie nicht verschiebt.
Die Verbindung im Leerlauf vorbei wait_timeoutLange Admin-Operationen scheitern am Ende, während gewöhnliche Seitenladungen niemals funktionieren. Die Lücke zwischen zwei Abfragen überschritt den Timeout und MySQL schloss den Socket.Warten Sie wait_timeout an oder brechen Sie die Arbeit in kürzere Batches, so dass keine einzelne Verbindung so lange im Leerlauf bleibt.
MySQL neu gestartet oder getötetDie Server-Uptime ist kürzer als die der Site, oder das Fehlerprotokoll zeichnet eine Abschaltung auf. Out-of-Memory-Kills sind der übliche Grund für kleine Computer.Eine Datenbank, die einmal für den Speicher getötet wurde, wird unter demselben Last wieder getötet.
Die Datenbank verweigert neue ArbeitFehler gruppieren sich unter Last und werden gelöscht, wenn der Datenverkehr abfällt, und die Prozessliste befindet sich in der Nähe von max_connections.Verringern Sie die Verbindung, anstatt das Limit zu erhöhen. Langlaufende Abfragen, die Slots belegen, sind die Ursache; eine höhere Obergrenze verzögert nur den gleichen Fehler.
Anleitung

Schritt für Schritt zur Lösung.

Die Befehle setzen WP-CLI und Shell-Zugriff voraus. Jeder Schritt erklärt, was er tut, damit Sie ihn bei Bedarf im Dashboard oder per SFTP ausführen können.

  1. Fragen Sie, wie lange der Server läuft

    Eine Betriebszeit kürzer als das letzte Mal, wenn die Website funktioniert hat, bedeutet, dass die Datenbank neu gestartet wurde, und nichts anderes auf dieser Liste muss überprüft werden.

    mysqladmin status
    mysql -e "SHOW GLOBAL STATUS LIKE 'Uptime';"
  2. Lesen Sie die beiden Grenzen, die wichtig sind

    Paketgröße und Leerlauf-Timeout machen den größten Teil dessen aus, was übrig bleibt, wenn ein Neustart ausgeschlossen ist.

    mysql -e "SHOW VARIABLES WHERE Variable_name IN ('max_allowed_packet','wait_timeout','interactive_timeout');"
  3. Heben Sie die Paketobergrenze an, wenn ein Import fehlschlägt

    Legen Sie es in der Serverkonfiguration statt pro Sitzung fest, sodass eine Wiederherstellung, die von einem beliebigen Tool ausgeführt wird, diese erbt.

    [mysqld]
    max_allowed_packet = 256M
    wait_timeout = 300
  4. Überprüfen Sie, ob es für das Gedächtnis getötet wurde

    Das Kernelprotokoll benennt den Prozess, den es gewählt hat. Dies ist die häufigste Ursache auf einem kleinen Server, auf dem MySQL neben PHP ausgeführt wird.

    dmesg -T | grep -i -E 'out of memory|killed process' | tail -n 20
  5. Wiederholen Sie die Operation in kleineren Stücken

    Wenn die Arbeit ein Import ist, hält das Batching jede Aussage gut unter der Decke und jede Verbindung ist beschäftigt.

    wp db import dump.sql
    wp db check
Mit MagicWP

Darum kümmert sich die Plattform.

Die Datenbank läuft in einem eigenen Container mit einer Speicherzulage, die allein dazu gehört, also ein PHP-Prozess, bei dem Spikes MySQL nicht vom Kernel getötet bekommen können - der Fehlermodus hinter den meisten dieser Fehler auf einem einzelnen freigegebenen Computer. Packet- und Timeout-Werte werden gegen diese Zulage bemessen und nicht bei den Verteilungsvorgaben, die eine große Wiederherstellung sofort übersteigt.

Häufige Fragen

Häufige Fragen.

Sind meine Daten beschädigt?
Nein. Die Verbindung ist gefallen, die Tabellen wurden nicht berührt. Ein Import, der auf halbem Weg fehlgeschlagen ist, hat einen Teildatensatz geschrieben, was ein anderes Problem ist und durch erneutes Ausführen nach dem Anheben des Limits behoben wird.
Warum nur während Importen und Backups?
Das sind die einzigen Operationen, die eine einzelne Anweisung dieser Größe senden oder eine Verbindung so lange halten.
Soll ich wait_timeout einfach sehr hoch setzen?
Es verbirgt eine Ursache und schafft eine andere: Leerlaufverbindungen sammeln sich an und besetzen Slots, die neue Anforderungen benötigen. Die Lösung des lang laufenden Vorgangs ist besser, als ihn länger im Leerlauf zu lassen.
Wie unterscheidet sich das von "Fehler beim Aufbau einer Datenbankverbindung"?
Dass man nie eine Verbindung bekam. Dieser hatte es und verlor es mitten in der Anfrage, weshalb die Site Sekunden früher arbeitete und warum die Fixes völlig anders sind.
Verwandte Fehler

War es keiner davon?

Diese Fehler können im Browser ähnlich aussehen.