El error 2006 llamado MySQL Sever se ha ido significa que el servidor se ha negado a conectarse a pesar de estar funcionando. Sólo hay tres razones conocidas por las que aparece el error. La primera razón es que el servidor está sobrecargado. El tiempo de espera ha expirado. La segunda razón es que el cliente ha enviado un paquete demasiado pesado. La tercera razón es que el servidor no se ha inicializado completamente. Más adelante consideraremos en detalle las razones por las que aparece el error y cómo solucionarlo.
Normalmente el error aparece al intentar conectarse a la base de datos usando PHP, cliente de consola, o en caso de usar PhpMyAdmin:
Examinemos cada situación por separado.
Como se mencionó al principio de este artículo, una de las posibles causas es el tiempo de espera expirado. Puede ser que el servidor esté sobrecargado y no pueda hacer frente a la carga - procesando todas las conexiones. Para entender cuánto tiempo tardan las peticiones al servidor, puede utilizar cualquier cliente de consola y conectarse al servidor. Si puede hacerlo, ejecute cualquier petición. Si las consultas tardan demasiado en procesarse, puede optimizar MySQL utilizando un script especial MySQLTuner. Normalmente aumenta el tamaño del pool del motor InnoDB configurando el parámetro innodb_buffer_pool_size
. El valor óptimo se determina utilizando el script anterior.
Si es 800 megabytes (puede ser cualquier otro tamaño), ajústalo:
$ sudo vi /etc/mysql/my.cnf
innodb_buffer_pool_size=800M
Hay otra forma de resolver el problema. Para ello, se aumenta el tiempo de respuesta del servidor. Para realizar esta tarea, necesita cambiar el parámetro wait_timeout
. Este es el tiempo en segundos durante el cual debe esperar una respuesta del servidor.
Por ejemplo:
wait_timeout=500
Cuando realice cambios, no olvide reiniciar el servidor a continuación:
$ sudo systemctl restart mysql
O:
$ sudo systemctl restart mariadb
Cuando el cliente de un usuario crea demasiados paquetes, el servidor generará este error. El tamaño de paquete disponible (valor máximo) puede aumentarse utilizando el parámetro max_allowed_packet
.
Por ejemplo:
$ sudo vi /etc/mysql/my.cnf
max_allowed_packet=128M
Preste especial atención al cliente, porque si envía muchas peticiones, obviamente está haciendo algo mal. Al menos no genere consultas a MySQL usando bucles for
.
Si decides desplegar MySQL o MariaDB en Docker, prepárate para encontrarte con un error similar. La inicialización del contenedor requiere un poco más de tiempo libre. Si no dejas que el contenedor complete la inicialización deteniéndolo e iniciándolo primero, la base de datos siempre devolverá este error. La solución es eliminar completamente los datos del contenedor de la base de datos.
Esto se hace así:
$ docker-compose down
o:
$ docker rm mysql-container
A continuación, debe eliminar el almacenamiento (volumen) con la base de datos incorrectamente inicializada. Pero al principio, busque en la lista de todos los almacenamientos:
$ docker volume ls
Después de borrar:
$ docker volume rm volume_name
Ahora puedes empezar a inicializar la aplicación, sólo espera hasta que el servidor de base de datos te diga que está listo y puedas conectarte a él.