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

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.