Solución al error "SQLSTATE[HY000] [2002] Connection refused - [InnoDB] Error number 28 means 'No space left on device'"

Author
Por Darío Rivera
Publicado el en MySQL

Hoy me encontré con un error bastante común cuando se trabaja en servidores Linux: el disco se llenó completamente. Esto suele provocar que los servicios fallen, las aplicaciones no puedan escribir archivos y que incluso el sistema se vuelva inestable.

Detectar la falta de espacio en disco puede resultar no trivial inicialmente ya que generalmente verás la falla en algún otro servicio como por ejemplo MySQL:

SQLSTATE[HY000] [2002] Connection refused

Origen

En este caso particular, debido a que no se puede establecer una conexión con el servidor de MySQL, y el error no es lo suficientemente detallado para determinar su causa, se puede verificar el archivo de logs. Se puede obtener la cause exacta justo después de intentar reiniciar el servicio sin éxito.

admin@ip-172-31-85-170:~$ sudo systemctl start mysql
Job for mysql.service failed because the control process exited with error code.

Diez líneas podrían ser suficientes para determinar el error.

admin@server:~$ tail -n 10 /var/log/mysql/error.log 
[DATETIME] 1 [Warning] [MY-012638] [InnoDB] Retry attempts for writing partial data failed.
[DATETIME] 1 [ERROR] [MY-012639] [InnoDB] Write to file ./ibtmp1 failed at offset 9437184, 1048576 bytes should have been written, only 839680 were written. Operating system error number 28. Check that your OS and file system support files of this size. Check also that the disk is not full or a disk quota exceeded.
[DATETIME] 1 [ERROR] [MY-012640] [InnoDB] Error number 28 means 'No space left on device'
[DATETIME] 1 [ERROR] [MY-012267] [InnoDB] Could not set the file size of './ibtmp1'. Probably out of disk space

La frase "No space left on device" es contundente.

Solución

En la mayoría de ocasiones podrás eliminar caché o archivos de logs para obtener espacio temporal mientras determinas una solución definitiva. Para esto, puedes hacer uso de los comandos df y du.

admin@server:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.7G  7.3G  9.8M 100% /

Como se ve en la salida, el disco estaba 100% lleno en la partición raíz /. Para localizar las carpetas con mayor uso, puedes ejecutar el siguiente comando. En este caso, se ha ejecutado sobre /var ya que se sospechaba de ese directorio.

sudo du -sh /var/*

El resultado mostró que la carpeta /var/www ocupaba más de 5 GB:

5.1G    /var/www

Al inspeccionar con más detalle:

admin@server:~$ sudo du -sh /var/www/sites/blog.pleets.org/storage/logs/*
556M    access.log
1.2M    error.log
4.1G    laravel.log

El archivo laravel.log pesaba 4.1 GB, consumiendo prácticamente todo el espacio disponible en el servidor. Eliminarlo provee una solución temporal mientras se asigna más espacio al disco (no recomendable en este caso) o se implementa una solución para eliminar logs cada cierto tiempo.


Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.