Ich habe eine interessante Antwort auf die Frage nach dem größten BLOB gesehen, den Sie haben könnten. Hier ist die Anweisung, die ich in ServerFault gesehen habe: 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 haben .
Basierend auf diesem ServerFault-Beitrag von Nils-Anders Nøttseter sollten Sie die Tabelle abfragen und herausfinden, welches BLOB das größte ist, diese Zahl mit 11 oder mehr multiplizieren und diese Antwort als max_allowed_packet für die Zukunft verwenden .
Es ist lustig, dass ich eine andere Frage angesprochen habe, bei der ich vorgeschlagen habe, die Größe des max_allowed-Pakets zu bestimmen, um das Problem hoffentlich zu lösen .
VORBEHALT
Nach dem Buch
Hier ist, was in den Absätzen 1-3 über MySQL-Pakete steht:
Der Kommunikationscode für das MySQL-Netzwerk 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 .
Wenn ein DBA dies über MySQL-Pakete weiß, kann er sie so dimensionieren, dass sie mehrere BLOBs in einem MySQL-Paket aufnehmen, auch wenn sie unangenehm groß sind.
In Bezug auf Ihre Situation sollten Sie herausfinden, welches das größte BLOB in Ihrer Datenbank ist, diese Zahl mit 11 multiplizieren und Ihr max_allowed_packet auf diese Zahl setzen. Sie sollten in der Lage sein, es für den Server ohne einen Neustart von MySQL einzustellen (Ich persönlich würde es auf 256 MB einstellen, weil es andere Probleme in Bezug auf Migration und Replikation angehen würde, die über den Rahmen dieses Forums hinausgehen). Führen Sie Folgendes aus, um es für Ihre Datenbank für alle eingehenden Verbindungen auf 256 MB festzulegen:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
Fügen Sie anschließend diese Einstellung zu my.cnf unter dem [mysqld]
Abschnitt hinzu:
[mysqld]
max_allowed_packet = 256M