Max_allowed_packet wurde geändert und es wird weiterhin der Fehler "Packet Too Large" angezeigt

8

Ich verwende mysqldump, um eine flache Datei für Sicherungszwecke zu erstellen. Ich habe diese Datei verwendet, um die Datenbank auf einem alternativen Server neu zu erstellen. Ich habe den Importvorgang über ssh in der Befehlszeile ausgeführt und mehrere Packet too LargeFehler erhalten.

Ich habe mysql mit einem viel größeren max_allowed_packet (dh 1000M) neu gestartet und trotzdem den Fehler erhalten. Ich habe sogar versucht, das max_allowed_packet in der Importdatei festzulegen, habe aber immer noch den Fehler erhalten.

Gibt es eine Möglichkeit, um sicherzustellen, dass das max_allowed_packet festgelegt ist, und / oder mysqldump zu verwenden, um eine Datei zu erstellen, die dieses Problem nicht verursacht?

Als Referenz:

Die unkomprimierte mysqldump-Datei ist ~ 2 GB groß

Der Datenbanktyp ist INNODB

Patrick
quelle

Antworten:

5

Das erste, worüber ich nachdachte, war, was max_allowed_packet tatsächlich steuert. Folgendes habe ich gefunden:

Gemäß Seite 99 von "Grundlegendes zu MySQL-Interna" (ISBN 0-596-00957-7) werden die Absätze 1-3 hier erläutert:

Der MySQL-Netzwerkkommunikationscode wurde unter der Annahme geschrieben, dass Abfragen immer relativ kurz sind und daher in einem Block an den Server gesendet und von diesem verarbeitet werden können, der in der MySQL-Terminologie als Paket bezeichnet wird . Der Server reserviert den Speicher für einen temporären Puffer zum Speichern des Pakets und fordert genug an, um es vollständig anzupassen. Diese Architektur erfordert eine Vorsichtsmaßnahme, um zu vermeiden, dass dem Server der Speicher ausgeht - eine Begrenzung der Paketgröße, 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 Zeichenfolgenfunktionen. Weitere Informationen finden Sie unter sql / field.cc und sql / intem_strfunc.cc .

Angesichts dieser Definition von max_allowed_packet habe ich dann etwas anderes von ServerFault entdeckt: innodb_log_file_size und innodb_log_buffer_size zusammen müssen größer sein als das Zehnfache Ihres größten Blob-Objekts, wenn Sie viele große Objekte haben

Unter Berücksichtigung dieser beiden Aspekte würde ich innodb_log_file_size in /etc/my.cnf auf die maximal zulässige Größe von 2047 MB ​​erhöhen. Dies erfordert natürlich Folgendes

service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start

Dies nimmt alle großen Blobs auf, die Sie möglicherweise in Ihren Daten haben.

RolandoMySQLDBA
quelle
Neugierig, woher das 10x kommt - ist es nur eine Faustregel oder gibt es Code in MySQL, der besagt, dass 10 feste Puffer zugewiesen werden, sodass Sie 10 benötigen, um sicherzustellen, dass einer von ihnen groß genug ist?
Gaius
Ist dieses Buch maßgebend?
Pacerier
2

MySQLs müssen sich max_allowed_packetimmer noch innerhalb der Grenzen der Shell befinden, mit der es gestartet wurde - zeigt das ulimit -a, dass data seg sizees unbegrenzt ist?

Gaius
quelle
2

Wird aus irgendeinem Grund max_allowed_packetvon mysqldump- by Design ignoriert ? Die eigentliche Ergänzung ist net_buffer_length. Also versuchen Sie es stattdessen

mysqldump --net_buffer_length=100k -u root -p databasename > dump.sql
Leopd
quelle
Das ist sehr aufschlussreich !!! Da der Fehlerbericht die erweiterte Einfügung in Verbindung mit diesem Problem behandelt, kann das Ausführen von --skip-extended-insert möglicherweise einige kompensieren, aber sicherlich einen größeren mysqldump erzeugen. +1 für Sie finden diesen Rohdiamanten, den Oracle für tot halten wird !!!
RolandoMySQLDBA
--skip-extended-insert funktioniert definitiv, aber in meiner Datenbank wurde die Wiederherstellung um das 100-fache verlangsamt, wodurch sie unbrauchbar wird.
Leopd
Es tut mir leid, mein Beileid. Lassen Sie mysqldump möglicherweise CSV-Dateien erstellen und versuchen, diese mithilfe von LOAD DATA INFILE zurückzuladen undulk_insert_buffer_size auf 1G oder 2G zu erhöhen. Hey, du weißt es nie !!!
RolandoMySQLDBA