¿Qué controla realmente la configuración MySQL "max_allowed_packet"?

8

Hemos estado limpiando los problemas de la base de datos durante las últimas cuatro horas, gracias a una mysqldumpfalla que no estaba causando errores suficientes. Recibimos estos errores:

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

¿Qué diablos hace esa configuración? Obviamente no es el tamaño del paquete IP, ya que lo tengo configurado en 32M ahora. ¿Por qué existe?

Plutor
fuente

Respuestas:

7

De acuerdo con la página 99 de "Comprender los componentes internos de MySQL" (ISBN 0-596-00957-7) , aquí están los párrafos 1-3 que lo explican:

El código de comunicación de red MySQL se escribió bajo el supuesto de que las consultas siempre son razonablemente cortas y, por lo tanto, el servidor puede enviarlas y procesarlas en un fragmento, que se denomina paquete en la terminología de MySQL. El servidor asigna la memoria para un búfer temporal para almacenar el paquete, y solicita lo suficiente para ajustarlo por completo. Esta arquitectura requiere una precaución para evitar que el servidor se quede sin memoria, un límite en el tamaño del paquete, lo que esta opción logra.

El código de interés en relación con esta opción se encuentra en sql / net_serv.cc . Eche un vistazo a my_net_read () , luego siga la llamada a my_real_read () y preste especial atención a net_realloc () .

Esta variable también limita la longitud de un resultado de muchas funciones de cadena. Vea sql / field.cc y sql / intem_strfunc.cc para más detalles.

Esta es probablemente la explicación más completa de max_allowed_packet que he visto. Escribí esos 3 párrafos directamente del libro.

RolandoMySQLDBA
fuente
Gracias por publicar eso. Parece indicar que "paquete" significa "paquete IP".
Randolf Richardson
Gran respuesta. Supongo que esto es lo más cerca que estoy de llegar a una respuesta real. (Todavía estoy bastante seguro de que no se está refiriendo a los paquetes IP No menciona IP en cualquier lugar, y yo creo 65535 bytes es típicamente el límite del mundo real de los paquetes IP fragmentados aun..)
Plutor
1

La documentación lo explica en detalle aquí:

"El tamaño máximo de un paquete o cualquier cadena generada / intermedia ..."

La documentación también continúa para abordar los BLOB y cómo esta configuración se vincula con ellos.

Randolf Richardson
fuente
Eso realmente no responde a mi pregunta. ¿Qué es un paquete en este contexto? ¿Es realmente un paquete IP? ¿No hay una mejor manera que un simple límite de bytes para capturar datos con formato incorrecto?
Plutor
A menos que definan "paquete" como algo más (que no parecen hacer en la documentación), es razonable esperar que "paquete" se refiera a un paquete IP.
Randolf Richardson
Encontré la definición en un libro que tengo. Agregué un extracto de ese libro como respuesta.
RolandoMySQLDBA