Solución al error "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'"
Cuando algo ha fallado en el servidor de msyql suele haber rastro de qué sucedió, cómo y en qué momento. Hace poco en este mismo blog tuvimos una baja de 20 minutos por este error el cuál solucionamos con prontitud. La cuestión desencadenó en un error 500 que guardaba algo más por debajo, en esencia el siguiente error de mysql.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
Origen
El socket no respondía, por lo cuál se hacía imposible una conexión por terminal. Verificando un poco más a fondo la causa de este incidente pudimos observar la causa. Para esto bastó ver el reporte del log de mysql con el siguiente comando en sistemas Linux.
tail -8 /var/log/mysql/error.log
Este comando muestra la salida de los últimos errores ocurridos en el servidor de MySQL. En este caso en particular fue la siguiente:
2020-10... 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 32002
2020-10... 0 [ERROR] [MY-012681] [InnoDB] mmap(137363456 bytes) failed; errno 12
2020-10... 1 [ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool
2020-10... 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2020-10... 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2020-10... 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-10... 0 [ERROR] [MY-010119] [Server] Aborting
2020-10... 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
Con estas dos líneas queda más que claro el origen del error: Cannot allocate memory for the buffer pool, mmap(137363456 bytes) failed; errno 12. Resulta que el servidor se quedó sin memoria para procesar las solicitudes a MySQL. Esto suele suceder cuando la base de datos ha incrementado de manera gradual con respecto a un tiempo anterior o bien algún pico de peticiones en el servidor.
Solución
La solución inmediata a este problema es bastante sencilla. Basta reiniciar el servidor de MySQL. En sistemas basados en Debian puedes ejecutar el siguiente comando:
sudo service mysql start
O bien mediante el gestor de servicios.
systemctl start mysql
Y todo esto para reiniciar el servidor de MySQL ?. Sí, es importante saber cuál es la causa de los errores ocurridos, ten en cuenta que si sucedió una vez probablemente volverá a suceder. Por eso es importante que verifiques el tráfico y la gestión de memoria del servidor. Un buen inicio puede ser la herramienta htop.
Hasta pronto!.