El servidor MySQL se ha ido obstruyendo la importación de volcados grandes


14

Estoy tratando de importar un gran volcado de sql (2GB) a mi mysql local en mi mac. He podido hacer esto en el pasado (estaba usando MAMP), pero ahora recibo un ERROR 2006 (HY000) en la línea 7758: el servidor MySQL se ha ido cada vez que intento importar el volcado. La base de datos contiene tablas innodb.

Intenté copiar el archivo my-innodb-heavy-4G.cnf en mi my.cnf para ver si esa configuración ayudaría, pero no tuve suerte.

¿Alguna idea sobre qué ajustar?

Estoy usando el "Archivo Mac OS X ver. 10.6 (x86, 64 bits), DMG" desde aquí: http://dev.mysql.com/downloads/mysql/

Respuestas:


15

Uno de los asesinos silenciosos de MySQL Connections es el paquete MySQL. Incluso el hilo de E / S de la replicación MySQL puede ser víctima de esto.

De acuerdo con la documentación de MySQL

  • También puede obtener estos errores si envía una consulta al servidor que es incorrecta o demasiado grande. Si mysqld recibe un paquete que es demasiado grande o está fuera de servicio, supone que algo salió mal con el cliente y cierra la conexión. Si necesita grandes consultas (por ejemplo, si está trabajando con grandes columnas BLOB), puede aumentar el límite de consulta configurando la variable max_allowed_packet del servidor, que tiene un valor predeterminado de 1 MB. También es posible que deba aumentar el tamaño máximo de paquete en el extremo del cliente. En la Sección C.5.2.10, “Paquete demasiado grande”, se brinda más información sobre cómo configurar el tamaño del paquete .

  • Una instrucción INSERT o REPLACE que inserta una gran cantidad de filas también puede causar este tipo de errores. Cualquiera de estas declaraciones envía una única solicitud al servidor independientemente del número de filas que se insertarán; por lo tanto, a menudo puede evitar el error reduciendo el número de filas enviadas por INSERTAR o REEMPLAZAR.

Por lo menos, debe asegurarse de que los tamaños de los paquetes tanto para la máquina de la que mysqldump'd como para la máquina que está cargando sean idénticos.

Puede haber dos (2) enfoques que puede tomar:

ENFOQUE # 1: Realice mysqldump usando --skip-extended-insert

Esto asegurará que el paquete MySQL no esté inundado con múltiples BLOBs, campos TEXT. De esa manera, los INSERTOS SQL se realizan uno por uno. Los principales inconvenientes son

  1. el mysqldump es mucho más grande
  2. Recargar un vertedero de este tipo lleva mucho más tiempo.

ENFOQUE # 2: Incrementar max_allowed_packet

Este puede ser el enfoque preferido porque implementar esto es solo un reinicio de mysql. Comprender qué es el paquete MySQL puede aclarar esto.

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 esta explicación, hacer INSERTs masivos cargará / descargará un paquete MySQL con bastante rapidez. Esto es especialmente cierto cuando max_allowed_packet es demasiado pequeño para la carga de datos dada que llega a él.

CONCLUSIÓN

En la mayoría de las instalaciones de MySQL, generalmente configuro esto en 256M o 512M. Debería experimentar con valores mayores cuando las cargas de datos producen errores de "MySQL se ha ido".


Intenté establecerme max_allowed_packeten 900M y estaba usando --skip-extended-insert(y tiene razón, eso hace que db-dumps huuuge), pero todavía falla. Sospecho que hay una línea particular en el basurero ahora que probablemente puedo evitar. Pero sigue siendo extraño: el volcado se puede importar bien en mi servidor CentOS.
naxoc

Terminé eliminando un inserto del volcado de sql que era una línea muy, muy larga. Eso lo solucionó (y la línea no era necesaria).
naxoc

Por cierto, asegúrese de que el carácter predeterminado para el volcado de datos sea compatible con el sistema operativo MacOSX y MySQL.
RolandoMySQLDBA

@naxov - Tengo curiosidad por la línea que sospechas en el basurero. ¿Hay algún campo TEXTO o BLOB involucrado?
RolandoMySQLDBA

Sí, un campo de texto muy largo.
naxoc

2

¿Cuánto tiempo dura esto antes de que se agote el tiempo de espera? El primer paso apostaría a verificar la configuración wait_timeouty interactive_timeoutpara asegurarse de que sean lo suficientemente grandes para su importación:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

El valor predeterminado es 8 horas (28800), por lo que ese no es el problema. Otras indicaciones de este problema se pueden encontrar aquí . Uno que se destaca es este:

Una aplicación cliente que se ejecuta en un host diferente no tiene los privilegios necesarios para conectarse al servidor MySQL desde ese host.

Verifique primero los permisos, pero luego revise esa lista de posibles problemas.


Todo está en localhost, por lo que no entiendo lo que quieres decir o no es el problema. ¿Quiso decir permisos como privilegios en mysql?
naxoc

2

Sí, por lo general, jugar con wait_timeout y max_allowed_packets también me permite evitar el mensaje de error.


Eso no funcionó para mí. Tuve que editar el sql en el archivo de volcado y eliminar una línea muy larga que causaba el problema.
naxoc

uno no debe jugar con algunos parámetros que no entiende
Jeredepp

2

Puede que no sea lo "correcto", pero podría funcionar (hazlo, ¿verdad?):

Intente dividir su volcado grande en varios archivos y ejecutarlos uno a la vez en secuencia. Mi enfoque sería partirlo por la mitad y probarlo. Luego divida cada mitad por la mitad, vuelva a probar, y así sucesivamente.

Tengo curiosidad por saber si la cantidad de RAM que tiene en su caja podría tener algo que ver con esto. ¿MySQL carga todo el volcado en la memoria cuando va a ejecutarlo? No lo sé ... pero si solo tienes 2 GB de RAM y algo de eso está en uso para ejecutar tu sistema operativo y otras aplicaciones, entonces este podría ser el problema.


2

Aquellos que no hayan tenido éxito con las otras sugerencias podrían considerar echar un vistazo al script de importador de volcado MySQL escalonado de BigDump PHP .

Es una solución alternativa para importar grandes volcados de bases de datos a MySQL. Lo he usado con éxito para importar un gran volcado de MySQL en mi entorno de desarrollo local (estoy usando MAMP en este caso).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.