Der Fehler 2006 namens MySQL Sever has gone away bedeutet, dass der Server die Verbindung verweigert hat, obwohl er läuft. Es gibt nur drei bekannte Gründe für das Auftreten dieses Fehlers. Der erste Grund ist, dass der Server überlastet ist. Die Wartezeit ist bereits abgelaufen. Der zweite Grund ist, dass der Client ein zu schweres Paket gesendet hat. Der dritte Grund ist, dass der Server nicht vollständig initialisiert wurde. Im Folgenden werden wir im Detail betrachten, aus welchen Gründen der Fehler auftritt und wie man ihn beheben kann.
In der Regel tritt der Fehler auf, wenn Sie versuchen, eine Verbindung zur Datenbank über PHP, einen Konsolen-Client oder über PhpMyAdmin herzustellen:
Lassen Sie uns jede Situation einzeln untersuchen.
Wie bereits zu Beginn dieses Artikels erwähnt, ist eine der möglichen Ursachen eine abgelaufene Wartezeit. Es kann sein, dass der Server überlastet ist und die Last nicht bewältigen kann - die Verarbeitung aller Verbindungen. Um zu verstehen, wie lange Serveranfragen dauern, können Sie einen beliebigen Konsolen-Client verwenden und sich mit dem Server verbinden. Wenn Sie dazu in der Lage sind, führen Sie eine beliebige Anfrage aus. Wenn die Verarbeitung von Anfragen zu viel Zeit in Anspruch nimmt, können Sie MySQL mit einem speziellen Skript MySQLTuner optimieren. Erhöhen Sie normalerweise die Poolgröße der InnoDB-Engine, indem Sie den Parameter innodb_buffer_pool_size
setzen. Der optimale Wert wird mit Hilfe des oben genannten Skripts ermittelt.
Wenn er 800 Megabyte beträgt (es kann auch eine andere Größe sein), setzen Sie ihn:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Es gibt eine weitere Möglichkeit, das Problem zu lösen. Zu diesem Zweck wird die Antwortzeit des Servers erhöht. Dazu müssen Sie den Parameter wait_timeout
ändern. Dies ist die Zeit in Sekunden, in der Sie auf eine Antwort des Servers warten sollten.
Ein Beispiel:
wait_timeout=500
Wenn Sie Änderungen vornehmen, vergessen Sie nicht, den Server anschließend neu zu starten:
$ sudo systemctl restart mysql
Oder:
$ sudo systemctl restart mariadb
Wenn der Client eines Benutzers zu viele Pakete erzeugt, gibt der Server diesen Fehler aus. Die verfügbare Paketgröße (Maximalwert) kann mit dem Parameter max_allowed_packet
erhöht werden.
Ein Beispiel:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Achten Sie besonders auf den Client, denn wenn er sehr viele Anfragen sendet, machen Sie offensichtlich etwas falsch. Erzeugen Sie zumindest keine Abfragen an MySQL mit for-Schleifen
.
Wenn Sie sich entscheiden, MySQL oder MariaDB in Docker einzusetzen, müssen Sie mit einem ähnlichen Fehler rechnen. Die anfängliche Initialisierung des Containers erfordert etwas mehr freie Zeit. Wenn Sie die Initialisierung des Containers nicht abschließen, indem Sie ihn zuerst stoppen und starten, wird die Datenbank immer diesen Fehler zurückgeben. Die Lösung besteht darin, die Containerdaten vollständig aus der Datenbank zu entfernen.
Dies geschieht folgendermaßen:
$ docker-compose down
oder:
$ docker rm mysql-container
Als nächstes müssen Sie den Speicher (Volume) mit der fehlerhaft initialisierten Datenbank löschen. Schauen Sie aber zunächst die Liste aller Speicher durch:
$ docker volume ls
Nach dem Löschen:
$ docker volume rm volume_name
Jetzt können Sie mit der Initialisierung der Anwendung beginnen. Warten Sie einfach, bis der Datenbankserver Ihnen mitteilt, dass er bereit ist und Sie sich mit ihm verbinden können.