quelle est une valeur raisonnable pour max_allowed_packet pour Drupal 7 avec un trafic modéré?

12

J'ai besoin de connaître un certain nombre de ball park pour cette variable pour mon site drupal 7. J'ai récemment reçu une exception PDO "drupal": SQLSTATE [08S01]: Erreur de liaison de communication: 1153 ". Je suis un débutant sur mysql et j'utilise l'hébergement partagé. J'ai probablement besoin de demander à l'administrateur de le faire pour moi.

Merci d'avance.

Patrick Cheung
la source
1
Ma réponse montre mon expérience avec cela, mais vous pouvez obtenir de meilleures réponses sur dba.stackexchange.com de la part de ceux qui maintiennent MySQL pour vivre.
mpdonadio

Réponses:

12

J'ai vu une réponse intéressante à une question sur le plus gros BLOB que vous pourriez avoir. Voici la déclaration que j'ai vue dans ServerFault: innodb_log_file_size et innodb_log_buffer_size combinés doivent être plus grands que dix fois votre plus grand objet blob si vous en avez beaucoup de gros .

Sur la base de cette publication ServerFault de Nils-Anders Nøttseter , vous devez interroger la table et découvrir quel BLOB est le plus grand, multiplier ce nombre par 11 ou plus et utiliser cette réponse comme max_allowed_packet à l'avenir.

C'est drôle que j'ai abordé une autre question où j'ai suggéré de dimensionner le paquet max_allowed pour, espérons-le, résoudre le problème .

CAVEAT

Selon le livre

PoweredImage

Voici ce que la page 99 paragraphes 1-3 dit à propos des paquets MySQL:

Le code de communication réseau MySQL a été écrit en supposant que les requêtes sont toujours raisonnablement courtes, et peuvent donc être envoyées et traitées par le serveur en un seul morceau, qui est appelé un paquet dans la terminologie MySQL. Le serveur alloue la mémoire à un tampon temporaire pour stocker le paquet, et il en demande suffisamment pour l'adapter entièrement. Cette architecture nécessite une précaution pour éviter que le serveur manque de mémoire --- un plafond sur la taille du paquet, ce que cette option accomplit.

Le code d'intérêt par rapport à cette option se trouve dans sql / net_serv.cc . Jetez un œil à my_net_read () , puis suivez l'appel à my_real_read () et portez une attention particulière à net_realloc () .

Cette variable limite également la longueur d'un résultat de nombreux fonctons de chaîne. Voir sql / field.cc et sql / intem_strfunc.cc pour plus de détails.

En sachant cela sur les paquets MySQL, un administrateur de base de données peut les dimensionner pour accueillir plusieurs BLOB dans un même paquet MySQL, même s'ils sont odieusement volumineux.

En ce qui concerne votre situation, vous devez savoir quel est le plus gros BLOB de votre base de données, multiplier ce nombre par 11 et définir votre max_allowed_packet sur ce nombre. Vous devriez pouvoir le définir pour le serveur sans redémarrer mysql (Personnellement, je le définirais 256M car cela résoudrait d'autres problèmes concernant la migration et la réplication, ce qui dépasse le cadre de ce forum). Pour le définir sur 256M pour votre base de données pour toutes les connexions entrantes, veuillez exécuter ceci:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Ensuite, ajoutez ce paramètre à my.cnf sous la [mysqld]section:

[mysqld]
max_allowed_packet = 256M
RolandoMySQLDBA
la source
Le paquet maximum autorisé n'affecterait-il pas également la taille des instructions d'insertion?
Buttle Butkus
@ButtleButkus Bien sûr. C'est pourquoi les paquets MySQL plus gros fonctionnent bien pour les INSERT. Veuillez noter que 1G est la taille maximale de max_allowed_packet. Notez également que la définition de max_allowed_packet sur 256M n'alloue pas 256M à l'avance. Selon dev.mysql.com/doc/refman/5.6/en/… , mysqld alloue ce que net_buffer_length est comme la taille initiale du paquet MySQL. Le paquet atteint progressivement la taille définie par max_allowed_packet. Par conséquent, il est correct de définir un grand paquet max_allowed_packet. INSERTs vous aimera pour cela.
RolandoMySQLDBA
Je n'ai jamais rien réglé de proche de cette taille, même si nous avons quelques machines avec 32 Go de RAM. Une application s'est étouffée, cependant, et je l'ai augmentée à 32M par défaut (1M?) Et cela a fonctionné. Je vais peut-être l'augmenter encore, si ça ne fait pas mal. Mais, les applications devraient-elles vérifier le max_allowed_packet et diviser les insertions en morceaux pour éviter d'atteindre cette limite? Quel est l'inconvénient de cette approche? Je devrais peut-être poster cette question sur le site de la pile dba.
Buttle Butkus
Pourriez-vous nous expliquer un peu plus pourquoi nous devrions multiplier par 11? La publication liée concerne les tampons innodb - comment cela est-il lié à la taille des paquets?
SystemParadox
4

Tiré de la page des exigences du serveur de base de données de Drupal :

Il peut être nécessaire de définir la variable système max_allowed_packet sur au moins 16M. Certains plans d'hébergement peu coûteux définissent cette valeur trop bas (la valeur par défaut de MySQL n'est que de 1M). Dans ce cas, vous devrez peut-être choisir un meilleur plan d'hébergement. Une valeur de 1M peut être suffisante pour Drupal 5.

Cela devrait convenir à un site d'hébergement mutualisé.

Phizes
la source
1
Sensationnel!! Les exigences du serveur Drupal indiquent officiellement qu'il fait 16M !! Je n'en ai jamais été conscient. Gardera cela à l'esprit la prochaine fois. Merci beaucoup d'avoir partagé cette information. Je souhaite pouvoir la marquer comme la meilleure réponse !!
shivams
2

Cela peut être un peu difficile à régler max_allowed_packet. Je n'ai pas encore trouvé de méthode pour calculer cette valeur. En règle générale, je le rencontre lorsque j'essaie de restaurer un instantané de base de données qui comprend des lignes des {cache}tables.

Quand j'ai ce problème, je choisirai une valeur entre 4M et 8M. Je continue à augmenter la valeur jusqu'à ce qu'elle s'arrête. Cependant, je ne sais pas si un hôte partagé changera cette valeur pour vous.

mpdonadio
la source