mysqli_real_connect - sqlstate hy000]: general error 2006 mysql server has gone away
ERROR 2006(HY000): el servidor MySQL se ha ido (18)
¿Qué tal usar el cliente mysql de esta manera?
mysql -h <hostname> -u username -p <databasename> < file.sql
Recibo este error cuando intento obtener un archivo SQL grande (una gran consulta INSERT
).
mysql> source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Nada en la tabla se actualiza. He intentado eliminar y recuperar la tabla / base de datos, así como reiniciar MySQL. Ninguna de estas cosas resuelve el problema.
Aquí está mi tamaño máximo de paquete:
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
Aquí está el tamaño del archivo:
$ ls -s file.sql
79512 file.sql
Cuando intento el otro método ...
$ ./mysql -u root -p my_db < file.sql
Enter password:
ERROR 2006 (HY000) at line 1: MySQL server has gone away
En general el error:
Error: 2006 (
CR_SERVER_GONE_ERROR
) - El servidor MySQL se ha ido
significa que el cliente no pudo enviar una pregunta al servidor .
mysql
import
En su caso específico al importar el archivo de la base de datos a través de mysql
, es probable que esto signifique que algunas de las consultas en el archivo SQL son demasiado grandes para importar y no se pudieron ejecutar en el servidor, por lo que el cliente falla en el primer error ocurrido.
Así que tienes las siguientes posibilidades:
Agregue la opción de fuerza (
-f
) para quemysql
proceda y ejecute el resto de las consultas.Esto es útil si la base de datos tiene algunas consultas grandes relacionadas con el caché que no son relevantes de todos modos.
Aumente
max_allowed_packet
ywait_timeout
en la configuración de su servidor (por ejemplo,~/.my.cnf
).Vuelque la base de datos con la opción
--skip-extended-insert
para desglosar las consultas grandes. Luego importarlo de nuevo.Intente aplicar la
--max-allowed-packet
paramysql
.
Razones comunes
En general, este error podría significar varias cosas, tales como:
una consulta al servidor es incorrecta o demasiado grande,
Solución: Aumente la variable
max_allowed_packet
.Asegúrese de que la variable esté en la sección
[mysqld]
, no en[mysql]
.No tenga miedo de usar números grandes para las pruebas (como
1G
).No te olvides de reiniciar el servidor MySQL / MariaDB.
Verifique nuevamente que el valor se haya establecido correctamente por:
mysql -sve "SELECT @@max_allowed_packet" # or: mysql -sve "SHOW VARIABLES LIKE ''max_allowed_packet''"
Obtuvo un tiempo de espera de la conexión TCP / IP en el lado del cliente.
Solución: Aumente la variable
wait_timeout
.Intentó ejecutar una consulta después de cerrar la conexión con el servidor.
Solución: Se debe corregir un error lógico en la aplicación.
Las búsquedas de nombres de host han fallado (por ejemplo, un problema con el servidor DNS), o el servidor se ha iniciado con la opción
--skip-networking
.Otra posibilidad es que su firewall bloquee el puerto MySQL (por ejemplo, 3306 por defecto).
El hilo en ejecución ha sido eliminado, así que vuelve a intentarlo.
Ha encontrado un error en el que el servidor murió al ejecutar la consulta.
Un cliente que se ejecuta en un host diferente no tiene los privilegios necesarios para conectarse.
Y muchos más, así que aprenda más en: B.5.2.9 El servidor MySQL ha desaparecido .
Depuración
Aquí hay algunas ideas de depuración de nivel experto:
Compruebe los registros, por ejemplo
sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
Pruebe su conexión a través de
mysql
,telnet
o funciones de ping (por ejemplo,mysql_ping
en PHP).Use
tcpdump
para detectar la comunicación de MySQL (no funcionará para la conexión de socket), por ejemplo:sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
En Linux, use
strace
. En BSD / Mac usedtrace
/dtruss
, por ejemplosudo dtruss -a -fn mysqld 2>&1
Obtenga más información sobre cómo depurar el servidor o cliente MySQL en: 26.5 Depuración y transferencia de MySQL .
Para referencia, verifique el código fuente en el archivo sql-common/client.c
responsable de lanzar el error CR_SERVER_GONE_ERROR
para el comando del cliente.
MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
arg, arg_length))
{
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
goto end;
}
Encontré este error cuando uso Mysql Cluster, no sé si esta pregunta proviene de un uso de cluster o no. Como el error es exactamente el mismo, dale mi solución aquí. Obteniendo este error porque los nodos de datos de repente se estrellan. Pero cuando los nodos se bloquean, aún puede obtener el resultado correcto utilizando cmd:
ndb_mgm -e ''ALL REPORT MEMORYUSAGE''
Y el mysqld también funciona correctamente. Entonces, al principio, no puedo entender lo que está mal. Y unos 5 minutos más tarde, el resultado de ndb_mgm no muestra ningún nodo de datos funcionando. Entonces me doy cuenta del problema. Entonces, intente reiniciar todos los nodos de datos, luego el servidor mysql está de vuelta y todo está bien.
Pero una cosa es extraña para mí, después de que perdí el servidor mysql para algunas consultas, cuando uso cmd como show tables
, todavía puedo obtener la información de retorno como 33 rows in set (5.57 sec)
, pero no se muestra información de la tabla.
Este es un problema poco frecuente, pero he visto esto si alguien ha copiado el directorio / var / lib / mysql completo como una forma de migrar su base de datos a otro servidor. La razón por la que no funciona es porque la base de datos se estaba ejecutando y usando archivos de registro. No funciona a veces si hay registros en / var / log / mysql. La solución es copiar los archivos / var / log / mysql también.
La actualización global y la configuración de my.cnf no funcionaron para mí por alguna razón. Pasando el valor max_allowed_packet
directamente al cliente trabajado aquí:
mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
La solución es aumentar los valores dados los wait_timeout
y connect_timeout
en su archivo de opciones, bajo la etiqueta [mysqld]
.
Tuve que recuperar una copia de seguridad de MySQL de 400MB y esto me funcionó (los valores que he usado a continuación son un poco exagerados, pero entiendes el punto):
[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
Para Amazon RDS (es mi caso), puede cambiar el valor del parámetro max_allowed_packet
a cualquier valor numérico en bytes que tenga sentido para los datos más grandes en cualquier inserción que pueda tener (por ejemplo: si tiene algunos valores de blob de 50mb en su inserción, establezca max_allowed_packet
a 64M = 67108864), en un parameter-group
nuevo o existente. Luego aplique ese grupo de parámetros a su instancia de MySQL (puede que sea necesario reiniciar la instancia).
Para obtener más información sobre este tema, consulte http://dev.mysql.com/doc/refman/5.5/en/gone-away.html o http://dev.mysql.com/doc/refman/5.1/en/gone-away.html según corresponda.
Por si acaso, para comprobar las variables se pueden utilizar.
$> mysqladmin variables -u user -p
Esto mostrará las variables actuales, en este caso max_allowed_packet, y como alguien dijo en otra respuesta, puede configurarlo temporalmente con
mysql> SET GLOBAL max_allowed_packet=1072731894
En mi caso, el archivo cnf no se tuvo en cuenta y no sé por qué, por lo que el código SET GLOBAL realmente ayudó.
Puede aumentar el paquete máximo permitido
SET GLOBAL max_allowed_packet=1073741824;
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet
Resolví el error ERROR 2006 (HY000) at line 97: MySQL server has gone away
y migró con éxito un archivo sql> 5GB al realizar estos dos pasos en orden:
Creó /etc/my.cnf como otros lo han recomendado, con los siguientes contenidos:
max_allowed_packet=500M
Anexando las banderas
--force --wait --reconnect
al comando (es decir,mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect
).
Nota importante: fue necesario realizar ambos pasos, ya que si no me molestaba en hacer los cambios en el archivo /etc/my.cnf, así como en añadir esos indicadores, faltaban algunas de las tablas después de la importación.
Sistema utilizado: OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 para osx10.8 (i386)
Si está en Mac e instaló mysql a través de brew como yo, lo siguiente funcionó.
-
cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
Fuente: Para las instalaciones de homebrew mysql, ¿dónde está my.cnf?
agregue
max_allowed_packet=1073741824
a/usr/local/etc/my.cnf
mysql.server restart
Si ninguna de estas respuestas le resuelve el problema, lo resolví eliminando las tablas y volviéndo a crearlas automáticamente de esta manera:
when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT
luego simplemente use esta copia de seguridad con su base de datos y eliminará y volverá a crear las tablas que necesita.
Luego hace una copia de seguridad de los datos, y hace lo mismo, y funcionará.
Si se está reconectando y obteniendo la ID de conexión 2, el servidor casi definitivamente se ha bloqueado.
Póngase en contacto con el administrador del servidor y pídales que diagnostiquen el problema. Ningún SQL no malicioso debería bloquear el servidor, y la salida de mysqldump ciertamente no debería.
Es probable que el administrador del servidor haya cometido algún error operacional importante, como asignar tamaños de búfer mayores que los límites de espacio de direcciones de la arquitectura, o más que la capacidad de la memoria virtual. El registro de errores de MySQL probablemente tendrá alguna información relevante; Ellos estarán monitoreando esto si son competentes de todos modos.
También puede iniciar sesión en la base de datos como root (o privilegio SUPER) y hacer
[mysqld]
max_allowed_packet=64M
no requiere un reinicio de MySQL también. Tenga en cuenta que debe arreglar su archivo my.cnf
como se describe en otras soluciones:
show variables like ''max_allowed_packet'';
Y confirme el cambio después de haber reiniciado MySQL:
[mysql]
connect_timeout = 43200
max_allowed_packet = 2048M
net_buffer_length = 512M
debug-info = TRUE
También puede usar la línea de comandos, pero eso puede requerir la actualización de los scripts de inicio / parada que pueden no sobrevivir a las actualizaciones y parches del sistema.
Según lo solicitado, estoy agregando mi propia respuesta aquí. Me alegra ver que funciona!
Tuve el mismo problema, pero cambiar max_allowed_packet en el archivo my.ini / my.cnf en [mysqld] hizo el truco.
añadir una línea
set global max_allowed_packet=64*1024*1024;
ahora reinicia el servicio MySQL una vez que hayas terminado.
Un par de cosas podrían estar sucediendo aquí;
- Su
INSERT
está ejecutando durante mucho tiempo, y el cliente se está desconectando. Cuando se vuelve a conectar no está seleccionando una base de datos, de ahí el error. Una opción aquí es ejecutar su archivo de proceso por lotes desde la línea de comando y seleccionar la base de datos en los argumentos, por lo tanto;
$ mysql db_name <source.sql
- Otra es ejecutar su comando a través de
php
o algún otro idioma. Después de cada instrucción de larga duración, puede cerrar y volver a abrir la conexión, asegurándose de estar conectado al inicio de cada consulta.
max_allowed_packet=64M
Agregar esta línea en el archivo my.cnf
resuelve mi problema.
Esto es útil cuando las columnas tienen valores grandes, lo que causa los problemas, puede encontrar la explicación here .
En Windows, este archivo se encuentra en: "C: / ProgramData / MySQL / MySQL Server 5.6"
En Linux (Ubuntu): / etc / mysql