Lösung für den Fehler „MySQL-Server ist verschwunden“

Lösung für den Fehler „MySQL-Server ist verschwunden“

MySQL-Server hat Problem in PHP behoben

1. Hintergrund

Ich habe zuvor ein Skript geschrieben, das der Konsolenbefehlszeile in Codeigniter ähnelte. Die Sleep-Anweisung im Skript dauerte lange, was zu dem Phänomen führte, dass die SQL-Operationen vor dem Sleep alle erfolgreich waren, aber nach dem Sleep wurde die SQL-Operation ausgeführt und eine Fehlermeldung gemeldet: Der MySQL-Server ist weg. Das heißt, die MySQL-Verbindung ist ungültig. Später fand ich heraus, dass es in MySQL zwei wichtige Konfigurationsparameter gibt:

interaktives_timeout
Wartezeit

Die Einheiten dieser beiden Parameter sind Sekunden (s). Der Standardwert beträgt 8 Stunden (28800). Das Wort interactive_timeout bezieht sich auf das interaktive Timeout. Es gibt im Allgemeinen zwei Arten von MySQL-Verbindungsmethoden, eine heißt „interaktiv“ und die andere „nicht interaktiv“. Die allgemeine Verbindung, die mysql -u root xxx oder Master-Slave-Replikation verwendet, ist eine „interaktive Verbindung“, und die Verbindungsmethode, die Javas JDBC oder den PDO-Treiber von PHP verwendet, ist im Allgemeinen eine „nicht interaktive Verbindung“. Wenn interactive_timeout jedoch nicht geändert wird, ändert sich dieser Wert nicht, aber wait_timeout hat bei verschiedenen Verbindungsmethoden unterschiedliche Werte.

Der wait_timeout-Wert ist der interactive_timeout-Wert bei „interaktiver Verbindung“. Wenn es sich um eine „nicht interaktive Verbindung“ handelt, ist der wait_timeout-Wert der ursprünglich in mysql.cnf konfigurierte Wert.

Letztendlich funktioniert nur der Wert wait_timeout. Dieses Konfigurationselement begrenzt die Verbindung im Ruhezustand (die aktuelle Anzahl der Verbindungen können Sie über show processlist anzeigen). Wenn die Ruhezeit dieser Verbindung den Wert wait_timeout überschreitet, wird die Verbindung getrennt oder gelöscht.

2. Wait_timeout-Analyse

1. Überprüfen Sie zunächst die mysql.conf-Konfiguration

Bildbeschreibung hier einfügen

Zuerst konfigurieren wir interactive_timeout = 10 wait_timeout = 5. Jetzt können wir die Werte dieser beiden Konfigurationselemente über den MySQL-Client (interaktive Verbindung) überprüfen: Variablen wie „%timeout%“ anzeigen;

2. Interaktive Verbindung

Das Ergebnis auf dem Client: wait_timeout beträgt nicht 10 s, wie in unserer msyql.conf konfiguriert, sondern 5 s.

Schauen wir uns dann an, welche Struktur wir erhalten, wenn PHP eine Verbindung zu MySQL herstellt (nicht-interaktive Verbindung) und dieselbe Anweisung ausführt:

3. Nicht interaktive Verbindung

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

An diesem Punkt ist wait_timeout der Wert, den wir ursprünglich in mysql.cnf konfiguriert haben.

Zusammenfassend lässt sich sagen: Der Wait_Timeout-Wert ist in verschiedenen „Verbindungsmodi“ unterschiedlich.

3. Analyse der Gründe für das Weggehen

Wenn wir die oben beschriebene Situation zusammenfassen, wissen wir es. Zu Beginn werden einige SQL-Anweisungen erfolgreich ausgeführt, aber die nachfolgenden SQL-Anweisungen werden nicht ausgeführt und melden den Fehler „weggefallen“. Die meisten Gründe dafür sind, dass die Verbindung länger als das wait_timeout im Leerlauf war und der MySQL-Server die Verbindung einseitig trennt. Der Clientcode verwendet diese Verbindungsvariable jedoch weiterhin und geht davon aus, dass die Verbindung noch in Ordnung ist (tatsächlich wurde die Verbindung zum MySQL-Server getrennt, aber wir gehen nur davon aus, dass die Verbindung noch gültig ist). Bei der Ausführung von SQL wird zwangsläufig ein Fehler gemeldet.

Wie also lösen wir diese Situation?

1. Sie können den wait_timeout-Wert entsprechend anpassen und erhöhen, sodass die Situation „Gone Away“ nicht so leicht ausgelöst wird. Der Nachteil besteht jedoch darin, dass die lange Verbindung im Ruhezustand nicht bereinigt wird und Ressourcen verschwendet werden.

2. Wenn das Problem mit der MSYQL-Verbindung durch Try-Cach ausgelöst wird, rufen Sie zuerst close() für die vorherige Datenbank auf. Öffnen Sie dann die Datenbankverbindung erneut und führen Sie den vorherigen Code aus. Der Code sieht jedoch sehr mühsam aus. Pseudocode:

$db = db();

versuchen {
   fun1$db); // Die Ausführung ist zu Beginn erfolgreich sleep(3600*10) // Angenommen, die Ruhezeit beträgt 10 Stunden fun2($db); // Nach 10 Stunden wird die Verbindung von MySQL beendet, was zu einem Fehler führt gone away
}fang(Ausnahme $e) {
  // Nachdem der Fehler gemeldet wurde, schließen wir die ungültige Verbindung und öffnen eine neue Verbindung $db->close();
  $db->öffnen();
  // Neue Verbindung herstellen und ausführen // fun2($db)  
}

3. Wenn Sie ein Framework wie Swoole oder Easyswoole verwenden, wird empfohlen, den MySQL-Pool-Verbindungspool zu verwenden. Und im Allgemeinen verfügt der Verbindungspool über Einstellungen für Heartbeat-Check-Ping, Verbindungsüberlebenserkennungsintervall, maximale Anzahl inaktiver Verbindungen usw., sodass Sie ihn nur einmal konfigurieren müssen. Sie können beispielsweise das aktive Verbindungsintervall kürzer konfigurieren, um sicherzustellen, dass die Verbindung nicht vom msyql-Server beendet wird. Beispiel: die Easyswoole-Konfiguration:

Bildbeschreibung hier einfügen

Ich habe beispielsweise vorher wait_timeout=10 eingestellt, aber wenn ich das Intervall des Aktivitätstests des MySQL-Verbindungspools von easyswoole nicht auf eine kürzere Zeit geändert hätte, wäre dieselbe Situation aufgetreten. Der erste Zugriff auf die Schnittstelle hat das SQL-Ausführungsergebnis erfolgreich zurückgegeben, aber als ich nach mehr als 10 Sekunden erneut auf die Schnittstelle zugegriffen habe, wurde die Fehlermeldung „MySQL ist verschwunden“ gemeldet. Nach der Änderung von setIntervalCheckTime() tritt dieses Problem nicht mehr auf. Wir verwenden mysql's show processlist, um die Anzahl der Verbindungen zu überprüfen:

Bildbeschreibung hier einfügen

Dies ist die Anzahl der Verbindungen, die EasySwoole uns hilft, aufrechtzuerhalten. Wenn der Schlaf 3 Sekunden überschreitet, hilft uns der Verbindungspool, am Leben zu bleiben, da die Überlebensprüfungszeit 3 ​​Sekunden beträgt, und die Schlafzeit beginnt wieder bei 0.

Nachfolgend finden Sie Ergänzungen von anderen Internetnutzern

Geben Sie MySQL ein

cmd

mysql -u Benutzername -p Passwort

Wenn wir MySQL verwenden, um eine große SQL-Datei zu importieren, erhalten wir möglicherweise eine Fehlermeldung, dass der MySQL-Server nicht mehr erreichbar ist. Das Problem besteht darin, dass der Standardwert von max_allowed_packet zu klein ist. Sie müssen nur den Wert dieses Elements erhöhen und es dann erneut importieren, damit der Vorgang erfolgreich ist. Die Funktion dieses Elements besteht darin, die Größe des vom MySQL-Server empfangenen Pakets zu begrenzen. Wenn die importierte Datei daher zu groß ist, kann sie den in diesem Element festgelegten Wert überschreiten, was zu einem fehlgeschlagenen Import führt! Sehen wir uns als Nächstes an, wie der Wert dieses Elements angezeigt und festgelegt wird.

Überprüfen Sie den Wert von max_allowed_packet

globale Variablen wie „max_allowed_packet“ anzeigen;
+--------------------+---------+
| Variablenname | Wert |
+--------------------+---------+
| maximal zulässiges Paket | 4194304 |
+--------------------+---------+

Sie können sehen, dass die Standardgröße dieses Elements nur 4M beträgt. Als nächstes setzen Sie den Wert auf 150M (1024*1024*150)

Setzen Sie global max_allowed_packet=157286400;

Überprüfen Sie die Größe erneut

globale Variablen wie „max_allowed_packet“ anzeigen;

Durch Erhöhen dieses Wertes sollte das erneute Importieren großer Datenmengen in SQL im Allgemeinen erfolgreich sein. Wenn weiterhin ein Fehler auftritt, erhöhen Sie den Wert einfach. Bitte beachten Sie, dass die Einstellung in der Befehlszeile nur für die aktuelle Zeit gültig ist. Nach einem Neustart des MySQL-Dienstes wird der Standardwert wiederhergestellt. Sie können jedoch die Konfigurationsdatei ändern (Sie können max_allowed_packet=150M in der Konfigurationsdatei my.cnf hinzufügen), um eine dauerhafte Gültigkeit zu erreichen. Wir importieren jedoch nicht oft große Datenmengen, daher denke ich persönlich, dass die aktuelle Konfiguration über die Befehlszeile wirksam sein kann und die Konfigurationsdatei nicht geändert werden muss.

Dies sind alle relevanten Wissenspunkte, die dieses Mal vorgestellt wurden. Ich hoffe, dass der von 123WORDPRESS.COM zusammengestellte Inhalt Ihnen helfen kann.

Das könnte Sie auch interessieren:
  • Mysql Master-Slave-Synchronisation Last_IO_Errno:1236 Fehlerlösung
  • MySQL-Daemon konnte nicht gestartet werden – Fehlerlösung
  • MySQL-Fehler „Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben“ - Lösung
  • Lösung für MySQL-Startfehler

<<:  Detailliertes Tutorial zum Minimieren der Installation der virtuellen CentOS 8.1-Maschine in VirtualBox

>>:  Beispielcode für horizontales Balkendiagramm von Echarts Bar

Artikel empfehlen

Verwendung des Linux-Telnet-Befehls

1. Einleitung Der Befehl Telnet dient zur Anmeldu...

Eine kurze Analyse des Zeitproblems von MySQL

Der Standardzeittyp (Datum/Uhrzeit und Zeitstempe...

Untersuchung der Wirkung der durch JS realisierten Seitenseitenleiste

Inhaltsverzeichnis Entdecken Sie: Anwendung von D...

So optimieren Sie die MySQL-Leistung durch langsame MySQL-Abfragen

Mit zunehmender Anzahl von Besuchen steigt der Dr...

Einfaches Tutorial zur Verwendung von Navicat für MySQL

empfehlen: Detailliertes Tutorial zur Registrieru...

Detaillierte Analyse des Unterschieds zwischen Ref und Reactive in Vue3.0

Inhaltsverzeichnis Ref und Reaktiv Referenz Reakt...

Beispielcode zum Setzen von Hotlinks und Koordinatenwerten für Webbilder

Manchmal müssen Sie mehrere Bereiche auf einem Bi...

Vue realisiert Click-Flip-Effekt

Verwenden Sie Vue, um einfach einen Click-Flip-Ef...

Eine Analyse von Div+Float, einem sehr wichtigen Konzept im Website-Design

Beim Erstellen einer Website treten immer wieder P...

So verwenden Sie MySQL-Stresstest-Tools

1. MySQLs eigenes Stresstest-Tool – Mysqlslap mys...

Unterschied zwischen var und let in JavaScript

Inhaltsverzeichnis 1. Bereiche werden in verschie...

Detaillierte Erläuterung des Ausführungsprozesses der MySQL-Update-Anweisung

Es gab bereits einen Artikel über den Ausführungs...

So löschen Sie die MySQL-Registrierung

Spezifische Methode: 1. Drücken Sie [ Win+R ], um...

Vue+Flask realisiert Videosynthesefunktion (Drag & Drop-Upload)

Inhaltsverzeichnis Wir haben in einem früheren Ar...