Was ist ein angemessener Wert für max_allowed_packet für Drupal 7 mit mäßigem Datenverkehr?

12

Ich benötige für diese Variable eine Parknummer für meine Drupal 7-Site. Ich habe kürzlich eine "drupal" PDOException erhalten: SQLSTATE [08S01]: Kommunikationsverbindungsfehler: Fehler 1153. Ich bin ein MySQL-Neuling und verwende Shared Hosting. Ich muss wahrscheinlich den Administrator bitten, dies für mich zu tun.

Danke im Voraus.

Patrick Cheung
quelle
1
Meine Antwort zeigt meine Erfahrung damit, aber unter dba.stackexchange.com erhalten Sie möglicherweise bessere Antworten von denen, die MySQL beruflich unterhalten.
mpdonadio

Antworten:

12

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

PowerfulImage

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
RolandoMySQLDBA
quelle
Würde das maximal zulässige Paket nicht auch die Größe der Einfügeanweisungen beeinflussen?
Buttle Butkus
@ ShuttleButkus Natürlich. Aus diesem Grund eignen sich größere MySQL-Pakete gut für INSERTs. Bitte beachten Sie, dass 1G die maximale Größe für max_allowed_packet ist. Beachten Sie auch, dass durch Festlegen von max_allowed_packet auf 256 MB im Voraus keine 256 MB zugewiesen werden. Laut dev.mysql.com/doc/refman/5.6/en/… weist mysqld die gesamte net_buffer_length als anfängliche MySQL-Paketgröße zu. Das Paket wächst allmählich auf die durch max_allowed_packet festgelegte Größe. Daher ist es in Ordnung, ein großes max_allowed_packet zu setzen. INSERTs werden Sie dafür lieben.
RolandoMySQLDBA
Ich habe noch nie etwas in der Nähe dieser Größe eingestellt, obwohl wir ein paar Computer mit 32 GB RAM haben. Eine Anwendung ist daran erstickt, und ich habe sie von der Standardeinstellung (1M?) Auf 32M erhöht, und das hat funktioniert. Vielleicht erhöhe ich es weiter, wenn es nicht weh tut. Aber sollten Anwendungen das Paket max_allowed_packet überprüfen und Einfügungen in Blöcke aufteilen, um zu vermeiden, dass diese Grenze überschritten wird? Was ist der Nachteil dieses Ansatzes? Vielleicht sollte ich diese Frage auf der DBA-Stack-Site posten.
Buttle Butkus
Könnten Sie etwas näher erläutern, warum wir mit 11 multiplizieren sollten? Der verlinkte Beitrag handelt von Innodb-Puffern - wie hängt das mit der Paketgröße zusammen?
SystemParadox
4

Entnommen aus Drupals Seite " Datenbankserver-Anforderungen ":

Möglicherweise muss die Systemvariable max_allowed_packet auf mindestens 16 MB festgelegt werden. Einige kostengünstige Hosting-Pläne setzen diesen Wert zu niedrig (der MySQL-Standard ist nur 1 MB). In diesem Fall müssen Sie möglicherweise einen besseren Hosting-Plan auswählen. Ein Wert von 1M kann für Drupal 5 ausreichend sein.

Sollte für eine Website auf Shared Hosting in Ordnung sein.

Phizes
quelle
1
Beeindruckend!! Laut offiziellen Drupal-Serveranforderungen sind es 16 Millionen !! Das war mir nie bewusst. Ich werde es beim nächsten Mal berücksichtigen. Vielen Dank für das Teilen dieser Informationen. Ich wünschte, ich könnte die beste Antwort markieren !!
Shivams
2

Das Einstellen kann etwas schwierig sein max_allowed_packet. Ich habe noch keine Methode gefunden, um diesen Wert zu berechnen. Normalerweise stoße ich darauf, wenn ich versuche, einen Datenbank-Snapshot wiederherzustellen, der Zeilen aus den {cache}Tabellen enthält.

Wenn ich dieses Problem habe, wähle ich einen Wert zwischen 4M und 8M. Ich stoße den Wert weiter an, bis er aufhört. Ich weiß jedoch nicht, ob ein freigegebener Host diesen Wert für Sie ändert.

mpdonadio
quelle