MySQL se detiene por falta de memoria 🎯 Solución con swap y reinicio automático
Tiempo de lectura: 2.93 minutos
Lo que encontrarás en este artículo
¿Te ha pasado que tu servicio de MySQL se detiene continuamente por falta de memoria?
Hoy veremos:
- cómo identificar cuál es el motivo por el cuál se detiene tu servicio de MySQL,
- cómo aliviar este problema, y
- cómo pedirle al servicio que se reinicie automáticamente (si en algún momento se cae).
Verificar el estado del servicio
Este comando muestra logs de fallas recientes y si la falla se debió a algún crash, archivos faltantes o falta de memoria:
sudo systemctl status mysql -l
Por ejemplo, tras ejecutarlo, podrías obtener un mensaje como el siguiente:
Oct 14 07:15:05 lamp-ecommerce systemd[1]: mysql.service: A process of this unit has been killed by the OOM killer.
Oct 14 07:15:05 lamp-ecommerce systemd[1]: mysql.service: Main process exited, code=killed, status=9/KILL
Oct 14 07:15:05 lamp-ecommerce systemd[1]: mysql.service: Failed with result 'oom-kill'.
Oct 14 07:15:05 lamp-ecommerce systemd[1]: Failed to start mysql.service - MySQL Community Server.
Oct 14 07:15:05 lamp-ecommerce systemd[1]: mysql.service: Scheduled restart job, restart counter is at 10.
Oct 14 07:15:05 lamp-ecommerce systemd[1]: mysql.service: Start request repeated too quickly.
Oct 14 07:15:05 lamp-ecommerce systemd[1]: mysql.service: Failed with result 'oom-kill'.
Oct 14 07:15:05 lamp-ecommerce systemd[1]: Failed to start mysql.service - MySQL Community Server.
Como puedes ver en la primera línea, el proceso has been killed by the OOM killer.
Esto significa que se ha detenido por falta de memoria, ya que OOM significa Out of Memory.
Si usas un servicio de VPS pequeño (de 512 MB o 1 GB de RAM), MySQL puede agotar fácilmente la memoria.
Verifica cuánta RAM tienes disponible
Para esto usamos el comando:
free -h
Y verás en tu terminal una respuesta como la siguiente:
root@lamp-ecommerce:/var/www/multivendor-ecommerce# free -h
total used free shared buff/cache available
Mem: 961Mi 434Mi 78Mi 31Mi 636Mi 526Mi
Swap: 0B 0B 0B
Este output confirma que tienes ~1 GB de RAM y no cuentas con swap.
Por tanto, MySQL se detiene cuando hay spikes en el uso de la memoria.
Solución
Idealmente deberías dedicar un tiempo para analizar si tienes consultas SQL lentas que puedas optimizar, o procesos que realicen muchas queries innecesariamente.
Esto a fin de decidir si vale la pena invertir en un servidor con mayor capacidad.
Pero si tienes un proyecto que a penas va empezando, y sobretodo, pocos usuarios, lo mejor es realizar algunas configuraciones para continuar usando el mismo servidor.
Veamos cómo hacer esto último paso a paso 👇
Paso 1. Agrega 1 GB de swap
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Con esto creas e inicias un archivo de intercambio (swap) de 1 GB en Linux.
Es decir, "has ganado" 1 GB más de memoria (virtual).
Paso 2. Verifica que haya funcionado
swapon --show
Este comando te permite listar las memorias de intercambio virtual (swap) que tienes activas en tu sistema.
Explicación
Veamos ahora: qué significa cada comando ejecutado en el paso 1.
sudo fallocate -l 1G /swapfile
→ Crea un archivo vacío de 1 GB, llamado /swapfile.
sudo chmod 600 /swapfile
→ Asigna permisos solo para el usurio root, por seguridad.
Así no está disponible para otros usuarios.
sudo mkswap /swapfile
→ Formatea el archivo para que el sistema lo reconozca como espacio disponible para swap.
sudo swapon /swapfile
→ Activa el archivo como memoria de intercambio (swap).
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
→ Añade la configuración al archivo /etc/fstab, para que se monte automáticamente al arrancar.
🎯 Resultado:
Obtienes 1 GB adicional de memoria virtual (swap).
Muy útil si tu RAM es poca o si un servicio (por ejemplo, MySQL) se queda sin memoria.
Volver a iniciar MySQL
Por cierto, si tu servicio estaba caído, puedes iniciarlo nuevamente con:
sudo service mysql restart
Y si todo va bien, ya no volverá a caerse.
Iniciar MySQL automáticamente
Mejor aún:
✅ Podemos hacer que systemd reinicie automáticamente MySQL si se detiene o falla.
Veamos cómo lograr esto fácilmente, en 3 pasos.
Paso 1. Editar el servicio de MySQL
sudo systemctl edit mysql
Esto abrirá un archivo. Aquí debemos agregar lo siguiente:
[Service]
Restart=always
RestartSec=5s
Guardamos cambios y cerramos el archivo.
Paso 2. Recargar systemd y reiniciar MySQL
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart mysql
Paso 3. Verificar configuración
Ejecuta este comando:
systemctl show mysql | grep Restart
Y deberías ver:
Restart=always
RestartSec=5s
Historial de reinicios
El siguiente comando te permite ver el historial de reinicios de MySQL:
journalctl -u mysql | grep "Restarting"
💡 Tip
Tal vez el problema no es la falta de recursos, sino más bien alguna query lenta, que puede ser optimizada.
Para empezar a recopilar dicha información puedes des-comentar las siguientes líneas en tu archivo /etc/mysql/mysql.conf.d/mysqld.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
Luego reinicia MySQL con sudo systemctl restart mysql.
Y podrás ver las queries lentas en el archivo que indicaste anteriormente:
sudo cat /var/log/mysql/mysql-slow.log
Despedida
Espero que esta guía te haya sido de ayuda.
Si deseas aprender más sobre MySQL, cómo escribir consultas, y optimizarlas, te invito a seguir mi curso de MySQL.