Cómo modificar y aumentar el número máximo de conexiones en MySQL
![]()
Cuando una aplicación utiliza MySQL con muchos usuarios simultáneos, puede llegar un momento en el que el servidor alcance el número máximo de conexiones permitidas. Cuando esto ocurre, MySQL puede devolver errores como:
ERROR 1040 (HY000): Too many connectionsEste problema significa que MySQL ha alcanzado el límite establecido para el número de conexiones simultáneas.
En este artículo veremos cómo consultar el límite actual, modificarlo temporalmente y establecer un valor permanente en MySQL.
1. Comprobar el número máximo de conexiones configurado
Lo primero es comprobar cuál es el valor actual de max_connections.
Podemos hacerlo desde MySQL ejecutando:
SHOW VARIABLES LIKE 'max_connections';El resultado será similar a:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+En este ejemplo, MySQL permite hasta 151 conexiones simultáneas.
2. Consultar cuántas conexiones se están utilizando
También es importante saber cuántas conexiones se están utilizando actualmente.
Para consultar el número actual:
SHOW STATUS LIKE 'Threads_connected';Por ejemplo:
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 37 |
+-------------------+-------+Esto indica que en ese momento hay 37 conexiones abiertas.
También podemos consultar el máximo de conexiones que se ha alcanzado desde el último arranque del servidor:
SHOW STATUS LIKE 'Max_used_connections';Este dato es especialmente útil para determinar si realmente necesitamos aumentar max_connections.
Por ejemplo:
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 148 |
+----------------------+-------+Si tenemos configurado:
max_connections = 151y hemos llegado a:
Max_used_connections = 148significa que el servidor ha estado muy cerca de alcanzar el límite.
3. Modificar max_connections temporalmente
MySQL permite modificar determinados parámetros dinámicamente sin reiniciar el servidor.
Para aumentar el número máximo de conexiones podemos utilizar:
SET GLOBAL max_connections = 300;Después podemos comprobar el nuevo valor:
SHOW VARIABLES LIKE 'max_connections';Deberíamos obtener:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 300 |
+-----------------+-------+Importante
Esta modificación es temporal.
Si reiniciamos MySQL, el servidor volverá al valor establecido en su archivo de configuración.
Por este motivo, si queremos que el cambio permanezca después de un reinicio, debemos modificar la configuración permanente de MySQL.
4. Modificar max_connections permanentemente
En sistemas Linux, la configuración de MySQL suele encontrarse en archivos dentro de:
/etc/mysql/En instalaciones de MySQL es habitual encontrar archivos de configuración como:
/etc/mysql/mysql.conf.d/mysqld.cnfPodemos editarlo con:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfDentro de la sección:
[mysqld]añadimos o modificamos:
max_connections = 300Por ejemplo:
[mysqld]
max_connections = 300Guardamos el archivo y reiniciamos MySQL:
sudo systemctl restart mysqlPosteriormente podemos comprobar que el valor se ha aplicado:
sudo systemctl status mysqlY desde MySQL:
SHOW VARIABLES LIKE 'max_connections';5. No conviene aumentar max_connections sin analizar el servidor
Aumentar el número máximo de conexiones no siempre soluciona el problema de fondo.
Cada conexión de MySQL consume recursos del servidor, especialmente memoria RAM.
Por este motivo, pasar directamente de:
151a:
1000sin analizar el servidor puede provocar un consumo excesivo de memoria e incluso hacer que el sistema empiece a utilizar la memoria virtual o termine teniendo problemas de rendimiento.
Antes de aumentar considerablemente el valor conviene comprobar:
- Memoria RAM disponible.
- Número de conexiones actuales.
- Número máximo de conexiones alcanzadas.
- Consultas que permanecen abiertas.
- Tiempo de vida de las conexiones.
- Configuración del pool de conexiones de la aplicación.
- Número de aplicaciones que utilizan MySQL.
6. Comprobar las conexiones abiertas
Podemos obtener información sobre las conexiones actuales utilizando:
SHOW PROCESSLIST;Si queremos obtener información más completa:
SHOW FULL PROCESSLIST;También podemos utilizar:
SELECT *
FROM information_schema.PROCESSLIST;Esto permite identificar qué usuarios están conectados, desde qué dirección, qué están ejecutando y cuánto tiempo llevan conectados.
Por ejemplo:
Id User Host db Command Time
12 aplicacion 192.168.21.3 empresa Sleep 35
15 aplicacion 192.168.21.3 empresa Query 2
18 aplicacion 192.168.21.4 empresa Sleep 120Las conexiones que aparecen continuamente en estado Sleep pueden ser normales si la aplicación utiliza un pool de conexiones, pero un número excesivo puede indicar una configuración incorrecta de la aplicación.
7. Consultar las conexiones por usuario
También puede ser interesante comprobar qué usuarios están generando más conexiones.
Por ejemplo:
SELECT USER, HOST, COUNT(*) AS conexiones
FROM information_schema.PROCESSLIST
GROUP BY USER, HOST
ORDER BY conexiones DESC;Esto nos permite detectar si un determinado usuario o aplicación está consumiendo una cantidad elevada de conexiones.
8. Revisar max_user_connections
Además de max_connections, MySQL dispone de otro parámetro importante:
max_user_connectionsEste parámetro limita el número de conexiones simultáneas que puede utilizar un usuario concreto.
Podemos comprobar su valor con:
SHOW VARIABLES LIKE 'max_user_connections';Si devuelve:
0significa que no se ha establecido un límite global específico para las conexiones por usuario.
También podemos establecer un límite para un usuario concreto:
ALTER USER 'usuario'@'192.168.21.3'
WITH MAX_USER_CONNECTIONS 50;En este ejemplo, el usuario podrá tener como máximo 50 conexiones simultáneas.
Esto puede ser útil cuando tenemos varias aplicaciones compartiendo el mismo servidor MySQL y queremos evitar que una sola aplicación consuma todas las conexiones disponibles.
9. Diferencia entre max_connections y max_user_connections
Es importante no confundir ambos parámetros.
max_connections
Define el número máximo de conexiones simultáneas que puede aceptar el servidor MySQL.
Por ejemplo:
max_connections = 300Significa que MySQL puede aceptar hasta 300 conexiones simultáneas.
max_user_connections
Limita las conexiones simultáneas de un usuario concreto.
Por ejemplo:
ALTER USER 'app'@'192.168.21.3'
WITH MAX_USER_CONNECTIONS 50;En este caso, el usuario app no podrá superar las 50 conexiones simultáneas, aunque el servidor permita 300.
10. Comprobar si estamos alcanzando el límite
Una de las comprobaciones más útiles es:
SHOW STATUS LIKE 'Max_used_connections';También podemos consultar:
SHOW STATUS LIKE 'Threads_connected';Los dos valores tienen significados diferentes:
| Variable | Significado |
|---|---|
Threads_connected | Conexiones abiertas actualmente |
Max_used_connections | Máximo de conexiones simultáneas alcanzado |
max_connections | Límite máximo configurado |
Por ejemplo:
Threads_connected = 80
Max_used_connections = 295
max_connections = 300Esto indicaría que actualmente hay 80 conexiones, pero anteriormente el servidor llegó a 295.
En este caso sería recomendable investigar qué provocó ese pico antes de aumentar todavía más el límite.
11. Consultar los intentos rechazados por exceso de conexiones
MySQL dispone también de la variable:
SHOW STATUS LIKE 'Connection_errors_max_connections';Si obtenemos un valor superior a cero, significa que se han producido intentos de conexión rechazados porque se había alcanzado el límite máximo.
Por ejemplo:
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| Connection_errors_max_connections| 27 |
+----------------------------------+-------+Esto indica que se produjeron 27 errores relacionados con haber alcanzado el máximo de conexiones.
Es un dato muy útil para determinar si el límite está siendo realmente un problema.
12. ¿Qué valor debemos configurar?
No existe un valor universal que sirva para todos los servidores.
Un servidor pequeño puede funcionar correctamente con:
max_connections = 150Mientras que un servidor dedicado a una aplicación con muchos usuarios puede necesitar:
max_connections = 300o incluso más.
Sin embargo, el valor debe determinarse teniendo en cuenta los recursos disponibles y la configuración de MySQL y de las aplicaciones.
Es preferible aumentar el límite progresivamente y monitorizar el consumo de recursos.
Por ejemplo:
151 → 200 → 300 → 400en lugar de establecer directamente un valor extremadamente elevado.
13. Un problema de conexiones no siempre se soluciona aumentando max_connections
Si el servidor alcanza constantemente el límite de conexiones, conviene investigar también la aplicación.
Algunas causas habituales son:
- Conexiones que no se cierran correctamente.
- Un pool de conexiones mal configurado.
- Consultas demasiado lentas.
- Transacciones que permanecen abiertas.
- Aplicaciones que crean una conexión nueva para cada operación.
- Procesos que mantienen conexiones inactivas durante demasiado tiempo.
- Un número excesivo de procesos de la aplicación.
Por ejemplo, si una aplicación abre cientos de conexiones y las mantiene abiertas innecesariamente, aumentar max_connections puede ocultar temporalmente el problema, pero no solucionarlo.
14. Comprobar la configuración desde la consola
Una comprobación rápida puede hacerse ejecutando:
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
SHOW STATUS LIKE 'Connection_errors_max_connections';Una posible situación sería:
max_connections = 300
Threads_connected = 125
Max_used_connections = 298
Connection_errors_max_connections = 15En este escenario, el servidor está llegando prácticamente al límite y además ya se han producido errores por exceso de conexiones.
Antes de aumentar el límite sería recomendable analizar qué está generando ese número de conexiones.
15. Ejemplo de configuración
Supongamos que tenemos un servidor MySQL con suficiente memoria RAM y queremos establecer un máximo de 300 conexiones.
Editamos:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfY dentro de [mysqld]:
[mysqld]
max_connections = 300Guardamos los cambios y reiniciamos:
sudo systemctl restart mysqlComprobamos:
mysql -u root -pY posteriormente:
SHOW VARIABLES LIKE 'max_connections';Si todo es correcto:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 300 |
+-----------------+-------+16. Conclusión
El parámetro max_connections permite controlar cuántas conexiones simultáneas puede aceptar MySQL.
Para analizar un problema de conexiones conviene revisar al menos:
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
SHOW STATUS LIKE 'Connection_errors_max_connections';Si el servidor está alcanzando el límite, podemos aumentar temporalmente el valor mediante:
SET GLOBAL max_connections = 300;Y para hacerlo permanente, establecerlo en la configuración de MySQL:
[mysqld]
max_connections = 300Sin embargo, aumentar max_connections debe hacerse teniendo en cuenta la memoria RAM y el resto de recursos del servidor. Un número excesivamente alto de conexiones puede provocar un consumo elevado de memoria y empeorar el rendimiento.
Por tanto, ante un error Too many connections, la solución correcta no consiste únicamente en aumentar el límite: también debemos comprobar qué aplicación está generando las conexiones y si estas se están gestionando correctamente.
