Cambió max_allowed_packet y aún recibe el error 'Paquete demasiado grande'

8

Yo uso mysqldump para crear un archivo plano con fines de copia de seguridad. He usado este archivo para recrear la base de datos en un servidor alternativo. Ejecuté el proceso de importación a través de ssh en la línea de comando y recibí múltiples Packet too Largeerrores.

Reinicé mysql con un paquete max_allowed_packet mucho más grande (es decir, 1000M) y aún recibí el error. Incluso intenté configurar max_allowed_packet en el archivo de importación, aún recibí el error.

¿Hay alguna manera de asegurar que max_allowed_packet esté configurado y / o use mysqldump que creará un archivo que no cause este problema?

Para referencia:

el archivo mysqldump sin comprimir es ~ 2GB

tipo de base de datos es INNODB

Patricio
fuente

Respuestas:

5

Lo primero que pensé fue en lo que realmente controla max_allowed_packet . Aquí está lo que encontré:

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.

Dada esa definición de max_allowed_packet, descubrí algo más de ServerFault: innodb_log_file_size e innodb_log_buffer_size combinados deben ser más grandes que diez veces su objeto blob más grande si tiene muchos objetos grandes

Teniendo en cuenta estas dos cosas, aumentaría innodb_log_file_size en /etc/my.cnf al tamaño máximo permitido, 2047M. Por supuesto, esto requiere lo siguiente

service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start

Esto acomodará cualquier gran blobs que pueda tener en sus datos.

RolandoMySQLDBA
fuente
Curioso sobre de dónde viene ese 10x, ¿es solo una regla general o hay un código en MySQL que dice que asigna 10 buffers fijos, por lo que necesita 10 para asegurarse de que 1 de ellos sea lo suficientemente grande?
Gaius
¿Es este libro autoritario?
Pacerier
2

MySQL max_allowed_packettodavía tiene que estar dentro de los límites del shell que lo inició, ¿ ulimit -amuestra que eso data seg sizees ilimitado?

Gayo
fuente
2

Por alguna razón, ¿ max_allowed_packetes ignorado por mysqldump- por diseño ? El complemento real es net_buffer_length. Así que en lugar de eso intente

mysqldump --net_buffer_length=100k -u root -p databasename > dump.sql
Leopd
fuente
¡Eso es muy esclarecedor! Dado que el informe de error discute la inserción extendida junto con este problema, tal vez hacer --skip-extended-insert puede compensar algo pero seguramente generará un mysqldump más grande. ¡¡+1 para que encuentres este diamante en bruto que Oracle dejará por muerto !!!
RolandoMySQLDBA
--skip-extended-insert definitivamente funciona, pero en mi base de datos se ralentizó la restauración en 100x haciendo que no se pueda usar.
Leopd
Lo siento, mis condolencias. Tal vez haga que mysqldump cree archivos CSV e intente cargarlos de nuevo usando LOAD DATA INFILE y aumentando bulk_insert_buffer_size a 1G o 2G. ¡Hey, nunca se sabe!
RolandoMySQLDBA