Error de MySQL 2006: el servidor mysql se ha ido

238

Estoy ejecutando un servidor en mi oficina para procesar algunos archivos e informar los resultados a un servidor MySQL remoto.

El procesamiento de los archivos lleva algún tiempo y el proceso se detiene a la mitad con el siguiente error:

2006, MySQL server has gone away

He oído sobre la configuración de MySQL, wait_timeout , pero ¿necesito cambiar eso en el servidor de mi oficina o en el servidor remoto de MySQL?

flotador izquierdo
fuente
2
depende de que el servidor de brujas da el error
bksi
2
posible duplicado de ERROR 2006 (HY000): el servidor MySQL se ha ido
Simon East
11
Para las personas que llegan aquí desde Google: si cambiar el max_allowed_packettamaño o la wait_timeoutcantidad no lo soluciona, verifique el uso de su memoria. Recibía el mismo error y mi servidor se estaba quedando sin memoria. Agregué un archivo de intercambio de 1GB y eso lo solucionó.
Pikamander2
2
@ Pikamander2 gracias por la pista!
ihsan
44
Oh! ¿Entonces todo son mentiras? ¿El servidor Mysql en realidad no fue a ninguna parte? ¿Todavía está ahí en mi servidor? Whao! :))
Damilola Olowookere

Respuestas:

32

Puede ser más fácil verificar si la conexión y restablecerla si es necesario.

Ver PHP: mysqli_ping para obtener información sobre eso.

Niet the Dark Absol
fuente
Buen punto, si tiene un proceso que es intermitente, entonces es mejor liberar su conexión para que no agote todas las conexiones. Reconstruir la conexión es generalmente barato. +1
Yzmir Ramirez
1
en 2018: mysqli_ping es depricated
fb
@fb ¿qué se usa para hacer eso con PDO?
beppe9000
359

Me he encontrado con esto varias veces y normalmente he encontrado que la respuesta es una configuración predeterminada muy baja de max_allowed_packet .

Elevarlo /etc/my.cnf(debajo [mysqld]) a 8 o 16M generalmente lo arregla. (El valor predeterminado en MySql 5.7 es 4194304, que es de 4 MB).

[mysqld]
max_allowed_packet=16M

Nota: Simplemente cree la línea si no existe

Nota: Esto se puede configurar en su servidor mientras se ejecuta.

Uso set global max_allowed_packet=104857600. Esto lo establece en 100 MB.

Jorge
fuente
28
Tenga en cuenta que esto se puede configurar en su servidor mientras se ejecuta. Uso: "set global max_allowed_packet = 104857600". NOTA: Mi valor lo establece en 100 MB.
rickumali
26
Para los usuarios de xampp, my.cnf se puede encontrar en: C: \ xampp \ mysql \ bin \
Valentin Despa
3
en WAMP: C: \ wamp \ bin \ mysql \ mysql5.6.12 \ my.ini, establezca max_allowed_packet = 500M en [wampmysqld]
Elia Weiss
2
También solucioné mi problema :)
Altaf Hussain
2
Nota importante: tuve que reiniciar mi servidor mysql para que este efecto surta efecto. es decir mysql.server stop, mysql.server start(Oct 2018, MySQL v5.7, MacOS)
Nitin Nain
41

Tuve el mismo problema, pero cambiar max_allowed_packetel my.ini/my.cnfarchivo debajo [mysqld]hizo el truco.

agregar una línea

max_allowed_packet = 500M

ahora restart the MySQL serviceuna vez que hayas terminado.

Sathish D
fuente
55
El otro tipo escribió 16M, usted escribe 500M, ¿cuál es el significado de esta configuración?
pal4life
1
@ pal4life Es el tamaño máximo de las declaraciones de inserción permitidas. ¿Qué sucede si su declaración de inserción es más de 16M?
Sathish D
Esto funcionó para mí, pero no sé por qué. El valor predeterminado era 1M pero cuando lo cambié a 100M el error desapareció. El problema comenzó cuando configuré wait_timeout = 30 en un intento de reducir la cantidad de subprocesos inactivos en mi servidor.
Vincent
36

Utilicé el siguiente comando en la línea de comandos de MySQL para restaurar una base de datos MySQL de más de 7 GB, y funciona.

set global max_allowed_packet=268435456;
Geshan Ravindu
fuente
me pregunto por qué fue esto rechazado? tiene sentido que el error esté relacionado con el tamaño del paquete ...
FlorinelChis
Esto resolvió mi problema, no está relacionado con la pregunta de manera directa, pero debería ayudar a las personas que tienen este otro problema.
Migerusantte
Para verificar si ha cambiado o ver el valor actual que se puede usarshow variables like 'max_allowed_packet';
Marcin
16

Error: 2006 ( CR_SERVER_GONE_ERROR )

Mensaje: el servidor MySQL se ha ido

En general, puede volver a intentar la conexión y luego volver a realizar la consulta para resolver este problema; intente de 3 a 4 veces antes de darse por vencido por completo.

Supongo que estás usando PDO. Si es así, detectaría la Excepción PDO, incremente un contador e intente nuevamente si el contador está por debajo de un umbral.

Si tiene una consulta que está causando un tiempo de espera, puede establecer esta variable ejecutando:

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

Donde 300 es el número de segundos que crees que es el tiempo máximo que la consulta podría tomar.

Más información sobre cómo lidiar con los problemas de conexión de Mysql.

EDITAR: otras dos configuraciones que quizás desee usar también son net_write_timeouty net_read_timeout.

Yzmir Ramirez
fuente
16

En MAMP (versión no profesional) agregué

--max_allowed_packet=268435456

a ...\MAMP\bin\startMysql.sh

Créditos y más detalles aquí

uwe
fuente
¡Muchas gracias por esto!
TechyDude
¡Trabajos! ¡Gracias!
Simon Franzen
11

Este error se produce debido a la caducidad de wait_timeout.

Simplemente vaya al servidor mysql, verifique wait_timeout:

mysql> MOSTRAR VARIABLES COMO 'wait_timeout'

mysql> establecer global wait_timeout = 600 # 10 minutos o tiempo máximo de espera que necesita

http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html

Saurabh Goyal
fuente
¡No entiendo por qué alguien rechazaría esta respuesta! Fue útil para mi.
Basil Musa
11

Hay varias causas para este error.

MySQL / MariaDB relacionados:

  • wait_timeout - Tiempo en segundos que el servidor espera a que se active una conexión antes de cerrarla.
  • interactive_timeout - Tiempo en segundos que el servidor espera una conexión interactiva.
  • max_allowed_packet- Tamaño máximo en bytes de un paquete o una cadena generada / intermedia. Establecido como el BLOB más grande, en múltiplos de 1024.

Ejemplo de my.cnf :

[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M

Servidor relacionado:

  • Su servidor tiene memoria completa - verifique la información sobre RAM con free -h

Marco relacionado:

  • Verifique la configuración de su marco. Django, por ejemplo, uso CONN_MAX_AGE(ver documentos )

Cómo depurarlo:

  • Verifique los valores de las variables MySQL / MariaDB.
    • con sql: SHOW VARIABLES LIKE '%time%';
    • línea de comando: mysqladmin variables
  • Active la verbosidad para errores:
    • MariaDB: log_warnings = 4
    • MySQL: log_error_verbosity = 3
  • Consulte los documentos para obtener más información sobre el error.
jozo
fuente
9

En Windows, los chicos que usan xampp deben usar esta ruta xampp / mysql / bin / my.ini y cambiar max_allowed_packet (en la sección [mysqld]) al tamaño de su elección. p.ej

max_allowed_packet=8M

Nuevamente en php.ini (xampp / php / php.ini) cambie upload_max_filesize el tamaño de elección. p.ej

upload_max_filesize=8M

Me dio dolor de cabeza por algún tiempo hasta que descubrí esto. Espero eso ayude.

Kenneth mwangi
fuente
esta debería ser la respuesta elegida
bysanchy
No puedo encontrar upload_max_filesizevariable. Siempre es desconocido en mi mysql
Aminah Nuraini
9

Recibía el mismo error en mi servidor Ubuntu DigitalOcean.

Intenté cambiar la configuración max_allowed_packet y wait_timeout pero ninguno de ellos lo solucionó.

Resulta que mi servidor estaba sin RAM. He añadido un archivo de intercambio de 1 GB y que fijo mi problema.

Verifique su memoria free -hpara ver si eso es lo que la está causando.

Pikamander2
fuente
1
Muchas gracias! ¡Tuve el mismo problema en mi DigitalOcean y esta solución funcionó! Ejecuté muchas instancias de mi script, pero después de algunos subprocesos, de repente se detuvo y eliminó todas las conexiones existentes. Ahora todo está bien.
Stalinko
7

Fue un problema de RAM para mí.

Estaba teniendo el mismo problema incluso en un servidor con 12 núcleos de CPU y 32 GB de RAM. Investigué más e intenté liberar RAM. Aquí está el comando que utilicé en Ubuntu 14.04 para liberar RAM:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Y lo arregló todo. Lo configuré en cron para que se ejecute cada hora.

crontab -e

0 * * * * bash /root/ram.sh;

Y puede usar este comando para verificar la cantidad de RAM disponible:

free -h

Y obtendrás algo como esto:

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G
Rehmat
fuente
5

En mi caso fue bajo valor de open_files_limit variable, lo que bloqueó el acceso de mysqld a los archivos de datos.

Lo comprobé con:

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

Después de cambiar la variable a gran valor, nuestro servidor estaba vivo nuevamente:

[mysqld]
open_files_limit = 100000
Fedir RYKHTIK
fuente
5

Si está utilizando el WAMPSERVER de 64 bits, busque múltiples ocurrencias de max_allowed_packet porque WAMP usa el valor establecido en [wampmysqld64] y no el valor establecido en [mysqldump], que para mí era el problema, estaba actualizando el incorrecto. Establezca esto en algo como max_allowed_packet = 64M.

Esperemos que esto ayude a otros usuarios de Wampserver.

Enomatix24
fuente
5

Esto generalmente indica problemas de conectividad del servidor MySQL o tiempos de espera. Generalmente se puede resolver cambiando wait_timeout y max_allowed_packet en my.cnf o similar.

Sugeriría estos valores:

wait_timeout = 28800

max_allowed_packet = 8M

Memorándum
fuente
4

Para Vagrant Box, asegúrese de asignar suficiente memoria a la caja

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end
Shadoweb
fuente
1
Gracias por esto :)
SynackSA
4

El escenario poco probable es que tenga un firewall entre el cliente y el servidor que fuerce el restablecimiento de TCP en la conexión.

Tuve ese problema y descubrí que nuestro firewall corporativo F5 estaba configurado para finalizar sesiones inactivas que están inactivas durante más de 5 minutos.

Una vez más, este es el escenario poco probable.

Ahmed
fuente
4

Siempre es una buena idea verificar los registros del servidor Mysql, por la razón por la que desapareció.

Te lo dirá.

Alex
fuente
4

Si está utilizando el servidor xampp:

Vaya a xampp -> mysql -> bin -> my.ini

Cambiar debajo del parámetro:

max_allowed_packet = 500M

innodb_log_file_size = 128M

Esto me ayudó mucho :)

Archana Kamath
fuente
3

descomenta la línea de abajo en tu my.ini/my.cnf, esto dividirá tu archivo grande en una porción más pequeña

# binary logging format - mixed recommended
# binlog_format=mixed

A

# binary logging format - mixed recommended
binlog_format=mixed
Nico
fuente
3

Encontré la solución a "# 2006 - El servidor MySQL se ha ido" este error. La solución es solo tienes que verificar dos archivos

  1. config.inc.php
  2. config.sample.inc.php

La ruta de estos archivos en Windows es

C:\wamp64\apps\phpmyadmin4.6.4

En estos dos archivos el valor de esto:

$cfg['Servers'][$i]['host']must be 'localhost' .

En mi caso fue:

$cfg['Servers'][$i]['host'] = '127.0.0.1';

cámbielo a:

"$cfg['Servers'][$i]['host']" = 'localhost';

Asegúrate en ambos:

  1. config.inc.php
  2. Los archivos config.sample.inc.php deben ser 'localhost'.

Y último set:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

Luego reinicie Wampserver.


Para cambiar el nombre de usuario y la contraseña de phpmyadmin

Puede cambiar directamente el nombre de usuario y la contraseña de phpmyadmin a través del archivo config.inc.php

Estas dos lineas

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';

Aquí puede dar un nuevo nombre de usuario y contraseña. Después de los cambios, guarde el archivo y reinicie el servidor WAMP.

um vida
fuente
2

Recibí el mensaje de error 2006 en diferentes software de clientes MySQL en mi escritorio Ubuntu. Resultó que mi versión del controlador JDBC era demasiado antigua.

Bo Guo
fuente
2

Esto podría ser un problema de su tamaño de archivo .sql.

Si está utilizando xampp. Vaya al panel de control de xampp -> Haga clic en Configuración de MySql -> Abrir my.ini.

Aumenta el tamaño del paquete.

max_allowed_packet = 2M -> 10M
Nikunj Dhimar
fuente
2

Hay una manera más fácil si está utilizando XAMPP. Abra el panel de control de XAMPP y haga clic en el botón de configuración en la sección mysql.
ingrese la descripción de la imagen aquí

Ahora haga clic en my.ini y se abrirá en el editor. Actualice max_allowed_packet a su tamaño requerido.

ingrese la descripción de la imagen aquí

Luego reinicie el servicio mysql. Haga clic en detener en el servicio Mysql, haga clic en comenzar nuevamente. Espera unos minutos. ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Luego intente ejecutar su consulta Mysql nuevamente. Espero que funcione.

Hriju
fuente
2

MAMP 5.3, no encontrará my.cnf y agregarlos no funciona, ya que max_allowed_packet se almacena en variables.

Una solución puede ser:

  1. Vaya a http: // localhost / phpmyadmin
  2. Ir a la pestaña SQL
  3. Ejecute SHOW VARIABLES y verifique los valores, si es pequeño, ejecute con valores grandes
  4. Ejecute la siguiente consulta, establece max_allowed_packet en 7gb:

    establecer global max_allowed_packet = 268435456;

Para algunos, es posible que también necesite aumentar los siguientes valores:

set global wait_timeout = 600;
set innodb_log_file_size =268435456;
Rupak Nepali
fuente
0

Para los usuarios que usan XAMPP, hay 2 parámetros max_allowed_packet en C: \ xampp \ mysql \ bin \ my.ini.

Subhash
fuente
0

Este error ocurre básicamente por dos razones.

  1. Tienes muy poca RAM.
  2. La conexión de la base de datos se cierra cuando intenta conectarse.

Puedes probar este código a continuación.

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
    try:            
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()
    except (AttributeError, MySQLdb.OperationalError):
        self.__init__()
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()

Mitiga el error sea cual sea el motivo, especialmente por el segundo motivo.

Si es causado por poca RAM, debe aumentar la eficiencia de conexión de la base de datos desde el código, desde la configuración de la base de datos, o simplemente aumentar la RAM.

Aminah Nuraini
fuente
0

Por si esto ayuda a alguien:

Recibí este error cuando abrí y cerré conexiones en una función que se llamaría desde varias partes de la aplicación. Tenemos demasiadas conexiones, por lo que pensamos que sería una buena idea reutilizar la conexión existente o descartarla y hacer una nueva como esta:

  public static function getConnection($database, $host, $user, $password)
 {
 if (!self::$instance) {
  return self::newConnection($database, $host, $user, $password);
 } elseif ($database . $host . $user != self::$connectionDetails) {

self :: $ instance-> query ('KILL CONNECTION_ID ()'); self :: $ instancia = nulo; return self :: newConnection ($ base de datos, $ host, $ usuario, $ contraseña); } return self :: $ instancia; } Bueno, resulta que hemos sido demasiado minuciosos con el asesinato, por lo que los procesos que hacen cosas importantes en la conexión anterior nunca podrían terminar su negocio. Entonces dejamos caer estas líneas

  self::$instance->query('KILL CONNECTION_ID()');
  self::$instance = null;

y como el hardware y la configuración de la máquina lo permiten, aumentamos el número de conexiones permitidas en el servidor agregando

max_connections = 500

a nuestro archivo de configuración. Esto solucionó nuestro problema por ahora y aprendimos algo sobre matar conexiones mysql.

Max
fuente
-5

Si sabe que va a estar desconectado por un tiempo, puede cerrar su conexión, hacer su procesamiento, volver a conectar y escribir sus informes.

Joshua Martell
fuente
2
Esta es realmente una respuesta viable, ya que MySQL cierra la conexión inactiva después de ocho horas.
Bojan Hrnkas