Qu'est-ce que le paramètre MySQL «max_allowed_packet» contrôle réellement?

8

Nous avons nettoyé les problèmes de base de données au cours des quatre dernières heures, grâce à une panne mysqldumpqui n'était pas suffisamment erronée. Nous obtenions ces erreurs:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

Que diable fait ce réglage? Ce n'est évidemment pas la taille du paquet IP, car je l'ai maintenant réglé sur 32M. Pourquoi existe-t-il?

Plutor
la source

Réponses:

7

Selon la page 99 de "Understanding MySQL Internals" (ISBN 0-596-00957-7) , voici les paragraphes 1-3 qui l'expliquent:

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.

C'est probablement l'explication la plus complète de max_allowed_packet que j'aie jamais vue. J'ai tapé ces 3 paragraphes directement dans le livre.

RolandoMySQLDBA
la source
Merci d'avoir posté ça. Il semble laisser entendre que «paquet» signifie «paquet IP».
Randolf Richardson
Très bonne réponse. Je suppose que c'est aussi proche que j'arrive à une vraie réponse. (Je suis toujours sûr que cela ne fait pas référence aux paquets IP. Il ne mentionne IP nulle part, et je crois que 65535 octets est généralement la limite du monde réel pour les paquets IP même fragmentés.)
Plutor
1

La documentation l'explique en détail ici:

"La taille maximale d'un paquet ou de toute chaîne générée / intermédiaire. ..."

La documentation traite également des BLOB et de la façon dont ce paramètre y est lié.

Randolf Richardson
la source
Cela ne répond pas vraiment à ma question. Qu'est-ce qu'un paquet dans ce contexte? S'agit-il en fait d'un paquet IP? N'y a-t-il pas un meilleur moyen qu'une simple limite d'octets pour capturer des données mal formées?
Plutor
À moins qu'ils ne définissent le «paquet» comme étant autre chose (ce qu'ils ne semblent pas faire dans la documentation), il est raisonnable de s'attendre à ce que le «paquet» se réfère à un paquet IP.
Randolf Richardson
J'ai trouvé la définition dans un livre que j'ai. J'ai ajouté un extrait de ce livre comme réponse.
RolandoMySQLDBA