MySQL-Fehler beim Lesen von Kommunikationspaketen


42

In MySQL-Fehlerprotokollen sehe ich einige Warnungen wie diese:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)

Ich habe keinen Datenverlust per se bemerkt, daher frage ich mich, was diese Warnung bedeutet oder was sie verursacht und wie man das Problem angehen könnte, das diese verursacht. Dies ist auf RHEL 6.1 und MySQL Enterprise 5.5.

Antworten:


50

Einer der stillen Killer von MySQL Connections ist das MySQL-Paket.

Lassen Sie uns zunächst herausfinden, was ein MySQL-Paket ist.

In den Abschnitten 1-3 unter "Grundlegendes zu MySQL-Interna" (ISBN 0-596-00957-7) wird Folgendes erläutert:

Der MySQL-Netzwerkkommunikationscode wurde unter der Annahme geschrieben, dass Abfragen immer relativ kurz sind und daher in einem Block, der in der MySQL-Terminologie als Paket bezeichnet wird, an den Server gesendet und von diesem verarbeitet werden können . Der Server weist den Speicher für einen temporären Puffer zum Speichern des Pakets zu und fordert genug an, um es vollständig zu passen. Diese Architektur erfordert eine Vorsichtsmaßnahme, um zu vermeiden, dass dem Server der Speicher ausgeht - eine Obergrenze für die Größe des Pakets, die mit dieser Option erreicht wird.

Der Code von Interesse in Bezug auf diese Option befindet sich in sql / net_serv.cc . Schauen Sie sich my_net_read () an , folgen Sie dann dem Aufruf von my_real_read () und achten Sie besonders auf net_realloc () .

Diese Variable begrenzt auch die Länge eines Ergebnisses vieler Zeichenkettenfunktionen. Weitere Informationen finden Sie in sql / field.cc und sql / intem_strfunc.cc .

Wenn ein Entwickler / DBA dies über MySQL-Pakete weiß, kann er sie so dimensionieren, dass sie mehrere BLOBs in einem Paket aufnehmen, selbst wenn sie unangenehm groß sind. Ein zu kleines Paket verursacht in dieser Hinsicht definitiv Probleme für offene Verbindungen.

Nach der MySQL-Dokumentation

  • Sie können diese Fehler auch erhalten, wenn Sie eine falsche oder zu große Abfrage an den Server senden. Wenn mysqld ein zu großes oder nicht ordnungsgemäßes Paket empfängt, wird davon ausgegangen, dass beim Client ein Fehler aufgetreten ist, und die Verbindung wird geschlossen. Wenn Sie große Abfragen benötigen (z. B. wenn Sie mit großen BLOB-Spalten arbeiten), können Sie das Abfragelimit erhöhen, indem Sie die Variable max_allowed_packet des Servers mit einem Standardwert von 1 MB festlegen. Möglicherweise müssen Sie auch die maximale Paketgröße auf der Client-Seite erhöhen. Weitere Informationen zum Einstellen der Paketgröße finden Sie in Abschnitt C.5.2.10, „Paket zu groß“.

  • Eine INSERT- oder REPLACE-Anweisung, die sehr viele Zeilen einfügt, kann ebenfalls diese Art von Fehlern verursachen. Eine dieser Anweisungen sendet unabhängig von der Anzahl der einzufügenden Zeilen eine einzelne Anforderung an den Server. Daher können Sie den Fehler häufig vermeiden, indem Sie die Anzahl der pro INSERT oder REPLACE gesendeten Zeilen verringern.

EMPFEHLUNG

Erhöhen Sie den Wert für max_allowed_packet auf eine viel größere Zahl, da der Standardwert 1 MB beträgt. Ich würde etwa das 10-fache des größten TEXT- oder BLOB-Felds vorschlagen, das Sie in Ihrem aktuellen Datensatz haben.

Um das max_allowed_packet auf 256M zu setzen, können Sie es zu /etc/my.cnf oder my.ini hinzufügen

[mysqld]
max_allowed_packet=256M

um zukünftige Neustarts von mysqld abzudecken. Führen Sie Folgendes aus, um den Wert jetzt auf dem Server zu installieren:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Versuche es !!!


Sehr gute Erklärung.
Vasilis Lourdas

4

In der Regel ist max_connections standardmäßig 100. Erhöhen Sie den Konfigurationsparameter

max_connections = 400, nach der Einstellung in my.cnf den Server neu starten oder dynamisch einstellen:

    set @@global.max_connections = 400;

Versuchen Sie einfach, die obige Empfehlung zu befolgen, um diese Warnmeldungen zu vermeiden und sicherzustellen, dass in Ihrem Netzwerk keine Paketverluste auftreten.


2

Dieses Problem trat vor kurzem auf, nachdem ich von MySQL Enterprise 5.1.x auf 5.7.x umgestiegen war. Ohne wesentliche Codeänderungen an der Anwendung wurde der Hinweis angezeigt .

In meinem Fall war die Hauptursache für das Erscheinen der Notiz das Programm, das mit noch offenen Verbindungen beendet wurde. Der Umstand, dass Verbindungen nicht geschlossen wurden, war etwas komplizierter und hing nicht mit MySQL zusammen, sondern mit ACE, Threads und TSS.


0

Diese my.ini-Zeile hat mein Problem gelöst:

log_error_verbosity=1

Verweisen Sie auf diesen Link


16
Ich glaube nicht, dass Sie das zugrunde liegende Problem gelöst haben, sondern einfach aufgehört haben, es zu protokollieren.
user19292

1
Ich hatte die gleiche Nachricht als "Notiz" gemeldet. Die Verwendung von log_error_verbosity = 2 löst tatsächlich das "Problem" (aber eine "Warnung" sollte
behoben
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.