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
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