MySQL se detiene por falta de memoria 🎯 Solución con swap y reinicio automático

Tiempo de lectura: 2.93 minutos

Póster del artículo MySQL se detiene por falta de memoria 🎯 Solución con swap y reinicio automático

¿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.

Status del servicio de MySQL

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.

Memoria RAM disponible y 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
Confirmar memoria virtual de intercambio (swap)

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.

# mysql # sql

Logo de Programación y más

Comparte este post si te fue de ayuda 😉.

Regístrate

Accede a todos los cursos, y mejora tus habilidades 🚀.

Cursos Recomendados 🚀

Imagen para el curso Aprende SQL

Aprende SQL

Aprende SQL y Bases de datos. Curso totalmente práctico. Usa JOINs, subqueries, UNION, y mucho más.

Iniciar curso
Imagen para el curso Docker y Microservicios

Docker y Microservicios

Aprende por qué es importante y cómo funciona Docker, con este nuevo curso práctico!

Iniciar curso
Imagen para el curso Aprende Javascript

Aprende Javascript

Domina JS con este curso práctico y completo! Fundamentos, ejemplos reales, ES6+, POO, Ajax, Webpack, NPM y más.

Iniciar curso

Artículos Relacionados 📚

Espera un momento 🎁 ...

¿Te gustaría aprender a programar, gratis?

Mago de Programación y más

Sólo debes registrarte 😉.