Was steuert die MySQL-Einstellung "max_allowed_packet" tatsächlich?


8

In den letzten vier Stunden haben wir Datenbankprobleme mysqldumpbehoben, da ein Fehler aufgetreten ist, der nicht ausreichend war. Wir bekamen diese Fehler:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

Was zum Teufel macht diese Einstellung? Es ist offensichtlich keine IP-Paketgröße, da ich sie jetzt auf 32 MB eingestellt habe. Warum existiert es?

Antworten:


7

In den Abschnitten 1-3 wird dies auf Seite 99 unter "Grundlegendes zu MySQL-Interna" (ISBN 0-596-00957-7) 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 beachten Sie insbesondere 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 .

Dies ist wahrscheinlich die vollständigste Erklärung von max_allowed_packet, die ich je gesehen habe. Ich habe diese 3 Absätze direkt aus dem Buch geschrieben.


Danke, dass du das gepostet hast. Es scheint anzudeuten, dass "Paket" "IP-Paket" bedeutet.
Randolf Richardson

Gute Antwort. Ich denke, das ist so nah, wie ich eine echte Antwort erhalte. (Ich bin mir immer noch ziemlich sicher, dass es sich nicht um IP-Pakete handelt. IP wird nirgendwo erwähnt, und ich glaube, 65535 Bytes sind in der Regel die reale Grenze für selbst fragmentierte IP-Pakete.)
Plutor 22.04.11

1

In der Dokumentation wird dies hier ausführlich erläutert:

"Die maximale Größe eines Pakets oder einer generierten / Zwischenzeichenfolge. ..."

In der Dokumentation wird auch auf BLOBs eingegangen und wie diese Einstellung mit ihnen zusammenhängt.


Das beantwortet meine Frage nicht wirklich. Was ist in diesem Zusammenhang ein Paket? Ist es eigentlich ein IP-Paket? Gibt es keinen besseren Weg als ein einfaches Byte-Limit, um fehlerhafte Daten abzufangen?
Plutor

Sofern sie "Paket" nicht als etwas anderes definieren (was sie anscheinend nicht in der Dokumentation tun), ist zu erwarten, dass sich "Paket" auf ein IP-Paket bezieht.
Randolf Richardson

Ich habe die Definition in einem Buch gefunden, das ich habe. Als Antwort habe ich einen Auszug aus diesem Buch hinzugefügt.
RolandoMySQLDBA
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.