Cuando estaba tratando de importar un archivo *.sql de gran tamaño, correspondiente a la creación de tablas y llenado de filas de una base de datos MySQL, la ejecución del script se detuvo con el error "MySQL server has gone away".



Este error indica que el servidor MySQL, por alguna razón, interrumpió la conexión con el cliente. Este error puede ocurrir incluso habiéndose conectado al servidor de forma local.

Para solucionar este problema es necesario determinar por qué el servidor cerró la conexión. Puede ser por dos motivos: 1- porque se agotó el tiempo de espera (timeout); o 2- porque un paquete enviado por el cliente superó el tamaño máximo permitido.

En mi caso sucedió que un paquete superó el tamaño máximo permitido. Se debió a que el archivo de importación *.sql, había sido volcado utilizando inserts extendidos (--extended-insert). La sintaxis de inserts extendidos es aquella en donde, en una única sentencia INSERT, se insertan todas las filas de la tabla. Por ejemplo:

INSERT INTO usuarios (id,nombre) VALUES (0,'fulano'), (1,'mengano'), (2,'sultano')...

El problema es que, para insertar todas las filas de una tabla muy grande, la sentencia queda demasiado extensa y por lo tanto el paquete donde se envía la instrucción supera el tamaño máximo permitido.

NOTA: en este punto aparentemente el cliente MySQL no divide a una única instrucción en varios paquetes. O al menos no sé si es posible configurar el cliente para limitar el tamaño de los paquetes que le envía al servidor (no encontré información al respecto en el manual: man mysql).

En ese momento, el servidor MySQL tenía un tamaño máximo permitido de paquete configurado en 1 Mb, por lo tanto si una instrucción necesitaba más de 1 Mb, el servidor interrumpía la conexión con el cliente.

Para solucionar el error, en este escenario, se debe ajustar la variable max_allowed_packet en el archivo de configuración del servidor MySQL (my.cnf), aumentando el valor a, por ejemplo, "4MB" (para permitir que los clientes puedan enviar paquetes más grandes). Y luego de importar la base de datos exitosamente, es posible volver a su valor anterior. Cada vez que se modifica esta variable es necesario recargar la configuración del servidor ("reload" o "restart").

# nano /etc/my.cnf
max_allowed_packet = 4MB
# service mysql reload

Esto es una razón válida para no utilizar inserts extendidos al momento de volcar bases de datos MySQL, utilizando mysqldump. Puede acelerar el tiempo de creación de la base de datos, pero también puede provocar inconvenientes, como en este caso.

También puede ocurrir que la ejecución de una instrucción supere el tiempo de espera máximo permitido (timeout). Para ello será necesario configurar la variable wait_timeout en un valor más grande (especificado en segundos).

Más información en la documentación oficial: B.5.2.9 MySQL server has gone away.


Tal vez pueda interesarte


Compartí este artículo