El error «Error 1040 (08004): Too many connections» en MySQL o MariaDB se produce cuando la base de datos ha alcanzado el límite máximo de conexiones simultáneas permitidas por su configuración.
Cuando este umbral se supera, el servidor rechaza cualquier nuevo intento de acceso, provocando que aplicaciones web, portales de clientes o sistemas ERP devuelvan errores HTTP 500 o pantallas en blanco por incapacidad de autenticación.
A continuación, analizamos cómo diagnosticar el consumo de procesos activos, ampliar el límite global de conexiones y optimizar las consultas persistentes.
Causas principales del agotamiento de conexiones
El bloqueo por exceso de sesiones simultáneas suele estar originado por:
- Configuración por defecto insuficiente: El parámetro
max_connectionsconserva el valor predeterminado (habitualmente 151 conexiones), insuficiente para entornos B2B con tráfico concurrente. - Conexiones durmientes (Sleep): Procesos que abren una sesión con la base de datos para ejecutar una consulta pero no la cierran adecuadamente, ocupando un conector de forma indefinida.
- Consultas lentas (Slow Queries): Consultas sin índices adecuados que tardan segundos en procesarse, acumulando solicitudes en cola.
- Uso desmedido de conexiones persistentes: Aplicaciones PHP configuradas con
pconnectque mantienen los hilos de ejecución abiertos de forma permanente.
Solución 1: Incrementar temporalmente el límite de conexiones en caliente
Si el servidor está bloqueado y necesitas restaurar el servicio de inmediato sin reiniciar la base de datos:
- Accede a la consola de MySQL/MariaDB como usuario administrador (root):
mysql -u root -p - Comprueba el límite de conexiones actual ejecutando:
SHOW VARIABLES LIKE 'max_connections'; - Aumenta el valor en tiempo de ejecución (por ejemplo, a 500 conexiones):
SET GLOBAL max_connections = 500;
Nota: Este ajuste surte efecto inmediatamente pero se perderá al reiniciar el servicio de base de datos. Para hacerlo permanente, aplica la Solución 2.
Solución 2: Modificar el archivo de configuración permanente (my.cnf)
Para garantizar que el nuevo límite se conserve tras un reinicio del servidor, se debe actualizar la directiva en el fichero principal de configuración.
| Sistema Operativo | Ruta Habitual de Configuración | Sección a Modificar |
| Ubuntu / Debian | /etc/mysql/mysql.conf.d/mysqld.cnf | [mysqld] |
| CentOS / RHEL / AlmaLinux | /etc/my.cnf | [mysqld] |
| Windows Server | C:\ProgramData\MySQL\MySQL Server X.X\my.ini | [mysqld] |
Pasos para editar el archivo:
- Abre el fichero con tu editor de texto preferido (ejemplo:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf). - Localiza la sección
[mysqld]y añade o edita la directiva:
Ini, TOML
[mysqld]
max_connections = 500
wait_timeout = 60
interactive_timeout = 60
- Los parámetros
wait_timeouteinteractive_timeoutreducen el tiempo que MySQL mantiene abiertas las conexiones inactivas (en estado Sleep) a 60 segundos antes de cerrarlas automáticamente. - Guarda el archivo y reinicia el servicio:
sudo systemctl restart mysql(omariadb).
Solución 3: Identificar y purgar conexiones inhabilitadas (Sleep)
Para verificar qué usuarios o peticiones están saturando la tabla de procesos:
- Dentro de la consola de MySQL, ejecuta:
SHOW FULL PROCESSLIST; - Si observas un listado extenso de procesos con el estado Sleep en la columna Command, puedes matar manualmente los hilos bloqueados mediante su
ID:KILL 12345;(sustituyendo12345por el identificador del proceso).
Preguntas Frecuentes (FAQ)
¿Existe un límite al aumentar el valor de max_connections?
Sí. Cada conexión abierta consume memoria RAM adicional del servidor (gestión de buffers por hilo como read_buffer_size o sort_buffer_size). Fijar un valor excesivamente alto sin disponer de la RAM suficiente puede provocar que el sistema operativo fuerce el cierre del proceso MySQL (OOM Killer).
¿Qué diferencia hay entre max_connections y max_user_connections?
max_connections define el límite global absoluto para todo el servidor, mientras que max_user_connections limita la cantidad máxima de conexiones simultáneas que puede abrir un único usuario de la base de datos.