MySQL Server se ha ido al importar archivos sql grandes


259

Traté de importar un archivo sql grande a través de phpMyAdmin ... Pero seguía mostrando error

'El servidor MySql se ha ido'

¿Qué hacer?


3
¿Cuáles son sus valores para max_allowed_packet y wait_timeout?
daemonofchaos

1
puedes intentar doblar max_allowed_packet. Un poco crudo, pero si eso funciona, puede encontrar un valor razonable.
Nanne

1
Gracias por la risa Cole Johnson. ¡Eso fue asombroso! Jajaja :)
mbrinson

Lo veo a menudo, por casualidad. Pero no puedo reproducir el mismo error nuevamente. Y, por lo tanto, se dio cuenta de que podría ser dinámico. A veces, si el cliente envía demasiados SQL al servidor (por ejemplo, desde un bucle), esto puede suceder. Encontrar la razón real de este error es importante. Revise sus registros de consultas para ver patrones repetitivos de SQL también para descubrir las pistas.
Bimal Poudel

a veces obtienes esto cuando el espacio en disco es bajo
pramodtech

Respuestas:


376

Como se indica aquí :

Las dos razones más comunes (y soluciones) para que el servidor MySQL haya desaparecido (error 2006) son:

El servidor agotó el tiempo de espera y cerró la conexión. Como arreglar:

  1. verifique que la variable wait_timeout en el archivo de configuración my.cnf de su mysqld sea lo suficientemente grande. En Debian: sudo nano /etc/mysql/my.cnfconfigure wait_timeout = 600segundos (puede ajustar / disminuir este valor cuando desaparezca el error 2006), luego sudo /etc/init.d/mysql restart. No lo comprobé, pero el valor predeterminado para wait_timeout podría ser de alrededor de 28800 segundos (8 horas).

  2. El servidor descartó un paquete incorrecto o demasiado grande. Si mysqld obtiene un paquete que es demasiado grande o incorrecto, se supone que algo salió mal con el cliente y cierra la conexión. Puede aumentar el límite máximo de tamaño de paquete aumentando el valor de max_allowed_packet en el archivo my.cnf. En Debian: sudo nano /etc/mysql/my.cnfestablezca max_allowed_packet = 64M(puede modificar / disminuir este valor cuando desaparezca el error 2006), luego sudo /etc/init.d/mysql restart.

Editar:

Tenga en cuenta que los archivos de opciones de MySQL no tienen sus comandos ya disponibles como comentarios (como en php.ini, por ejemplo). Por lo que debe escribir cualquier cambio / pellizco en my.cnfo my.iniy colocarlos en mysql/datael directorio o en cualquiera de los otros caminos, en el grupo adecuado de opciones tales como [client], [myslqd], etc. Por ejemplo:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Luego reinicie el servidor. Para obtener sus valores, escriba el cliente mysql:

> select @@wait_timeout;
> select @@max_allowed_packet;

72
En mi caso fue la variable max_allowed_packet . Se estableció en un valor predeterminado de 1 MB (puede ver esto ejecutando la SHOW VARIABLESconsulta MySQL) y el archivo que estaba importando tenía algunos registros muy grandes. Abrí el archivo my.ini (estaba ejecutando Windows) y establecí el valor en esto: max_allowed_packet = 64Mreinicié MySQL y volví a ejecutar la importación.
Brent Matzelle

Estaba cargando archivos grandes a la base de datos con problemas web. Esto ayudó, gracias ... :-)
inf3rno

@BrentMatzelle Eso ciertamente se hizo cargo del problema "Mysql se ha ido". ¡Gracias!
asprin

2
No puedo encontrar la wait_timeoutlínea
Oki Erie Rinaldi

55
en el caso de Windows (con Xampp) era mi archivo my.ini e innodb_lock_wait_timeout
Ananda

98

Para mí esta solución no funcionó, así que ejecuté

SET GLOBAL max_allowed_packet=1073741824;

en mi cliente SQL.

Si no puede cambiar esto con el servicio MYSql en ejecución, debe detener el servicio y cambiar la variable en el archivo "my.ini".

Por ejemplo:

max_allowed_packet=20M

1
Esto funcionó para mí en MAMP (OS X) cuando las otras respuestas más populares no lo hicieron. ¿Pero es permanente?
atwixtor

2
@atwixtor no, la configuración de variables como esta funciona hasta que se reinicia el servidor. y luego se restablecen al valor predeterminado.
d.raev

1
Eso funcionó, en una máquina XAMPP de prueba en Windows tuve que modificar tanto el php.iniarchivo (como lo sugiere @GBD en la respuesta) como el archivo de configuración de MySQL my.inipara que funcione.
Gruber

2
Sugeriría agregar que puede verificar el tamaño actual conSHOW variables LIKE 'max_allowed_packet'
Arth

Esto no es permanente, ya que el valor se restablecerá cuando el servidor se reinicie (eventualmente), pero tampoco es solo para la sesión actual. Configurar max_allowed_packeten un cliente y luego importar el .sqlarchivo grande en otra sesión funcionará bien.
VoteyDisciple

21

Si está trabajando en XAMPP, puede solucionar el problema del servidor MySQL con los siguientes cambios.

abra su archivo my.ini la ubicación de my.ini es (D: \ xampp \ mysql \ bin \ my.ini)

cambiar los siguientes valores variables

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

samp para wamp, max_allowed_packet = 64M
Andrew

19

Si está ejecutando con valores predeterminados, entonces tiene mucho espacio para optimizar su configuración mysql.

El primer paso que recomiendo es aumentar max_allowed_packet a 128M.

Luego descargue el script MySQL Tuning Primer y ejecútelo. Proporcionará recomendaciones a varias facetas de su configuración para un mejor rendimiento.

También busque ajustar sus valores de tiempo de espera tanto en MySQL como en PHP.

¿Qué tan grande (tamaño de archivo) es el archivo que está importando y puede importarlo usando el cliente de línea de comando mysql en lugar de PHPMyAdmin?


Gracias, ya tenía max_allowed_packet establecido en 16M, luego encontré esta pregunta y la planteé a 32M pensando que seguramente sería suficiente, pero luego vi su respuesta y 128M definitivamente funciona. ¿Supongo que toda la declaración SQL dentro del archivo * .sql se trata como un solo paquete?
Elijah Lynn

8

Si está utilizando MAMP en OS X, deberá cambiar el max_allowed_packetvalor en la plantilla para MySQL.

  1. Puede encontrarlo en: Archivo> Editar plantilla> MySQL my.cnf

  2. Luego solo busque max_allowed_packet, cambie el valor y guarde.


6

Resolví mi problema con este breve archivo /etc/mysql/my.cnf:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
confirmó que esto también funciona para MySQL v5.6.12 en WAMP: en Windows, agregue las líneas "wait_timeout" y "max_allowed_packet" arriba a la sección [mysqld] de: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

Gracias @dan resolvió mi problema de un año jaja, nunca agregué esa configuración en la sección[mysqld]
shivgre

Esto funciona para MySQL v5.7. my-default.ini no se crea de manera predeterminada, por lo que debe crearlo.
Rodolfo Velasco

5

La otra razón por la que esto puede suceder es que se está quedando sin memoria. Verifique / var / log / messages y asegúrese de que su my.cnf no esté configurado para que mysqld asigne más memoria de la que tiene su máquina.

Su proceso mysqld puede ser eliminado por el núcleo y luego reiniciado por el proceso "safe_mysqld" sin que se dé cuenta.

Use top y observe la asignación de memoria mientras se está ejecutando para ver cuál es su espacio libre.

haga una copia de seguridad de my.cnf antes de cambiarlo.


Esto es lo que estaba causando mi problema. Agregué un archivo de intercambio de 1GB y lo arregló por completo.
Pikamander2

5

Tuve este error y otros relacionados cuando importé a un archivo SQL de 16 GB. Para mí, editando my.ini y configurando lo siguiente (basado en varias publicaciones diferentes) en la sección [mysqld]:

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

Si está ejecutando bajo Windows, vaya al panel de control, servicios y mire los detalles de MySQL y verá dónde está my.ini. Luego, después de editar y guardar my.ini, reinicie el servicio mysql (o reinicie la computadora).

Si está utilizando HeidiSQL, también puede configurar algunos o todos estos utilizando eso.


2

Actualicé "max_allowed_packet" a 1024M, pero aún no funcionaba. Resulta que mi script de implementación se estaba ejecutando:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

Asegúrese de especificar explícitamente un número mayor desde la línea de comando si lo está haciendo de esta manera.


2

Si sus datos incluyen BLOBdatos:

Tenga en cuenta que una importación de datos desde la línea de comandos parece ahogarse con los datos BLOB, lo que da como resultado el error 'El servidor MySQL se ha ido'.

Para evitar esto, vuelva a crear mysqldump pero con la --hex-blobbandera:

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

que escribirá el archivo de datos con valores hexadecimales en lugar de binarios, entre otros textos.

PhpMyAdmin también tiene la opción "Volcar columnas binarias en notación hexadecimal (por ejemplo," abc "se convierte en 0x616263)" que funciona bien.

Tenga en cuenta que existe un error de larga data (a partir de diciembre de 2015) que significa que las GEOMcolumnas no se convierten: ¿ Realice una copia de seguridad de una tabla con una columna GEOMETRÍA utilizando mysqldump? por lo tanto, usar un programa como PhpMyAdmin parece ser la única solución (la opción indicada anteriormente convierte correctamente las columnas GEOM).


1

Si tarda mucho en fallar, amplíe la wait_timeoutvariable.

Si falla de inmediato, amplíe la max_allowed_packetvariable; Si aún no funciona, asegúrese de que el comando sea SQL válido. La mía tenía citas sin escapes que arruinaban todo.

Además, si es factible, considere limitar el número de inserciones de un solo comando SQL a, digamos, 1000. Puede crear una secuencia de comandos que cree múltiples declaraciones a partir de una sola reintroduciendo la parte INSERTAR ... cada n inserciones.


1

obtuve un error similar ... para resolver esto simplemente abra el archivo my.ini ... aquí en la línea no 36 cambie el valor del tamaño máximo permitido del paquete, es decir. max_allowed_packet = 20M


1

Asegúrese de que el proceso mysqld no se reinicie debido a los administradores de servicios como systemd.

Tuve este problema en vagabundo con centos 7. Los ajustes de configuración no ayudaron. Resultó que era systemd que mataba el servicio mysqld cada vez que tomaba demasiada memoria.


0

Tuve un error similar hoy al duplicar la base de datos (el servidor MySQL se ha ido ...), pero cuando intenté reiniciar mysql.server restart, recibí un error

ERROR! The server quit without updating PID ...

Así es como lo resolví: abrí Aplicaciones / Utilidades / y ejecuté Activity Monitor

 quit mysqld

luego pude resolver el problema de error con

mysql.server restart

0

Estoy haciendo algunos cálculos grandes que implican la conexión mysql para permanecer mucho tiempo y con datos pesados. Me enfrentaba a este "problema de Mysql go away". Así que traté de optimizar las consultas, pero eso no me ayudó, luego aumenté el límite de variables mysql que se establece en un valor inferior de forma predeterminada.

wait_timeout max_allowed_packet

Hasta el límite que le convenga, debe ser Any Number * 1024 (Bytes). puede iniciar sesión en la terminal utilizando el comando ' mysql -u username - p ' y puede verificar y cambiar estos límites variables.


0

Para alojamiento compartido GoDaddy

En las cuentas de alojamiento compartido de GoDaddy, es complicado modificar los archivos PHP.ini, etc. Sin embargo, hay otra forma y funcionó perfectamente para mí. (Acabo de cargar con éxito un archivo de texto .sql de 3.8Mb, que contiene 3100 filas y 145 cols. Usando el comando IMPORTAR en phpMyAdmin, estaba obteniendo el temido error del servidor MySQL , y no hay más información).

Encontré que Matt Butcher tenía la respuesta correcta. Al igual que Matt, había intentado todo tipo de trucos, desde exportar bases de datos MySQL en fragmentos pequeños hasta escribir scripts que dividen las importaciones grandes en pequeñas. Pero aquí está lo que funcionó:

(1) CPANEL ---> ARCHIVOS (grupo) ---> COPIA DE SEGURIDAD

(2a) En el encabezado "Copias de seguridad parciales" ...
(2b) En "Descargar una copia de seguridad de la base de datos MySQL"
(2c) Elija su base de datos y descargue una copia de seguridad (este paso es opcional, pero sabio)

(3a) Directamente a la derecha de 2b, bajo el encabezado "Restaurar una copia de seguridad de la base de datos MySQL"
(3b) Elija el archivo de importación .SQL de su disco local
(3c) La verdadera felicidad será suya (en breve ...) 5 segundos

Pude usar este método para importar una sola tabla. Nada más en mi base de datos se vio afectado, pero ese es el paso (2) anterior para proteger.

Notas:
a. Si no está seguro de cómo crear un archivo de importación .SQL, use phpMyAdmin para exportar una tabla y modificar esa estructura de archivos.

FUENTE: Matt Butcher 2010 Article


Bien, entonces un voto negativo inmediato, pero no hay comentarios sobre por qué. ¿Esta información no funcionó para alguien? Si es así, por favor comparta, funcionó para mí, por eso agregué esta respuesta. Las otras respuestas anteriores no funcionaron para mí, pero esta solución sí. Entonces, ¿por qué el voto negativo? Si estás en GoDaddy y esto no funciona para ti, me gustaría saber para poder ayudarte. Sin embargo, si no está utilizando el alojamiento compartido GoDaddy, ¿por qué rechazaría esta respuesta solo porque no se aplica a usted ?
cssyphus

0

Si aumentar max_allowed_packetno ayuda.

Recibía el mismo error que usted al importar un .sqlarchivo a mi base de datos a través de Sequel Pro.

El error aún persistió después de subir max_allowed_packeta, 512Masí que ejecuté la importación en la línea de comando en su lugar con:

mysql --verbose -u root -p DatabaseName < MySQL.sql

Dio el siguiente error:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

Encontré un par de preguntas útiles de StackOverflow:

En mi caso, mi .sqlarchivo estaba un poco corrupto o algo así. El volcado de MySQL que recibimos viene en dos archivos zip que deben concatenarse juntos y luego descomprimirse. Creo que la descompresión se interrumpió inicialmente, dejando el archivo con algunos caracteres extraños y codificaciones. Conseguir un nuevo volcado de MySQL y descomprimirlo funcionó correctamente para mí.

Solo quería agregar esto aquí en caso de que otros descubrieran que aumentar la max_allowed_packetvariable no estaba ayudando.



0

Tengo el mismo problema con

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

En el archivo \ xampp \ mysql \ bin \ my.ini de phpmyadmin solo obtenemos

[mysqldump]
max_allowed_packet=110M

que es solo para mysqldump -u root -p dbname. Resolví mi problema reemplazando el código anterior con

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
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.