Cómo solucionar el error «Too many connections» que puede producirse en servidores de base de datos MySQL o MariaDB. Cuál es el motivo de este error y cómo solucionarlo.
- Error Too many connections en MySQL/MariaDB.
- Monitorizar el número de conexiones concurrentes al servidor de MySQL/MariaDB.
- Ampliar el límite de conexiones máximas permitidas en MySQL/MariaDB para solucionar error Too many connections.
- Ajuste de memoria RAM usada por MySQL/MariaDB para compensar el aumento del límite de conexiones.
Error Too many connections en MySQL/MariaDB
Cuando tenemos algún software o sitio web que conecta con un servidor de base de datos MySQL o MariaDB y recibimos, de vez en cuando, el error:
Too many connections
Es debido a que estamos superando el límite de conexiones concurrentes permitidas en el servidor de base de datos MySQL.
Monitorizar el número de conexiones concurrentes al servidor de MySQL/MariaDB
MySQL/MariaDB tiene un parámetro para definir el límite de conexiones concurrentes: max_connections, que por defecto suele tener valores de entre 150 y 200. Podemos consultar el valor actual de este parámetro accediendo a la línea de comandos de MySQL, ejecutando el comando:
1 |
mysql -u usuario -p |
Y ejecutando el comando:
1 |
show variables like "max_connections" |

Antes de realizar cualquier modificación en este parámetro (u otros) de configuración de MySQL, es conveniente hacer una copia de seguridad del servidor. Y, también, es recomendable monitorizar el número de conexiones concurrentes durante un tiempo, para conocer el número real de conexiones y saber qué valor es el óptimo para nuestra organización. Para obtener el número de conexiones concurrentes en un servidor de MySQL/MariaDB, podemos conectarnos a la línea de comandos de MySQL, con el comando:
1 |
mysql -u usuario -p |
Y ejecutar el comando:
1 |
show processlist; |
Nos mostrará un detalle de las conexiones actuales al servidor de base de datos MySQL/MariaDB:

Si queremos mostrar únicamente el número de conexiones podemos usar el comando:
1 |
SHOW STATUS WHERE `variable_name` = 'Threads_connected'; |

Si queremos obtener este valor desde fuera de la línea de comandos de MySQL (desde el shell de Linux o Windows), podemos usar el comando:
1 |
mysqladmin -u root -pContraseña -i 5 extended-status | grep "Threads_connected" |
Que mostrará las conexiones actuales y las irá actualizando cada pocos segundos:

Lo ideal y recomendable es tener este valor monitorizado en algún sistema de monitorización, como Pandora FMS.
Ampliar el límite de conexiones máximas permitidas en MySQL/MariaDB para solucionar error Too many connections
Una vez que hayamos analizado y obtenido el número de conexiones habitual en nuestra organización, podremos modificar el parámetro «max_connections» para ajustarlo a nuestras necesidades y así solucionar el error «Too many connections». Lo habitual será tener que ampliarlo.
Si queremos modificar este límite sin tener que reinicar el servicio de MySQL/MariaDB, accederemos accederemos a la línea de comandos de MySQL, con el comando:
1 |
mysql -u usuario -p |
Y ejecutaremos el siguiente comando para ampliar el límite de max_connections a 800:
1 |
set global max_connections = 800; |
El cambio se aplicará en caliente, pero no será permanente, es decir, si reiniciamos el servicio de MySQL/MariaDB, este cambio se perderá y el valor del parámetro max_connections volverá al anterior que tuviera.
Para hacer el cambio permanente tendremos que editar el fichero de configuración de MySQL/MariaDB, que en equipos Linux suele estar en alguna de estas carpetas:
/etc/my.cnf
/etc/mysql/my.cnf
Lo editaremos con:
1 |
sudo nano /etc/my.cnf |
Y modificaremos el parámetro max_connections al valor que queramos establecer. Si el parámetro no existe, lo añadiremos al grupo [mysqld]:

Para que se aplique el cambio hay que reiniciar el servicio de MySQL/MariaDB. Para ello, desde el shell de comandos del sistema operativo, en el caso de Linux Debian y MariaDB, ejecutaremos:
1 |
sudo systemctl restart mariadb.service |
Según el motor de base de datos, o el sistema operativo, lo reiniciaremos con un comando determinado.
El límite de conexiones concurrentes habrá subido y, en teoría, habremos resuelto el error Too many connections.
Ajuste de memoria RAM usada por MySQL/MariaDB para compensar el aumento del límite de conexiones
Es importante tener en cuenta que si ampliamos el valor de max_connections y recibimos muchas más conexiones concurrentes, puede que se requiera de más RAM en el equipo o de ampliar los parámetros de uso de RAM de MySQL/MaridaDB para compensar. Una conexión necesitará, aproximadamente, entre 2MB y 10MB. Por lo que si tenemos, por ejemplo, 500 conexiones, consumirán aproximadamente entre 1Gb y 5GB de memoria RAM.
Estos parámetros de uso de RAM por MySQL/MariaDB son, entre otros:
- key_buffer_size: para uso de RAM de tablas MyISAM. Si tenemos muchas tablas de este tipo conviene asignar a este valor el 25% de la memoria RAM del equipo (aproximadamente). Por ejemplo, para un equipo con 20GB de RAM, se le asignaría un valor de 6400MB o bien 6GB, quedando:
- key_buffer_size = 6G
- innodb_buffer_pool_size: si se usan tablas InnoDB, es recomendable asignarle entre el 50 y el 70% de la memoria RAM del equipo. Para el ejemplo anterior, si el equipo tiene 20GB de RAM, podríamos asignar a este parámetro unas 12GB de RAM, quedando:
- innodb_buffer_pool_size = 12G
Una configuración de ejemplo para MySQL 5, con unas 1.000 posibles conexiones concurrentes y con 20GB de memoria RAM. La base de datos tiene unas 150 tablas. Se usan tablas MyISAM y también InnoDB, principalmente estas últimas y el servidor es dedicado a MySQL:
OBSERVACIÓN IMPORTANTE: la siguiente configuración es una aproximación y quizá sea bastante agresiva para un servidor con muchas conexiones concurrentes. Es un ejemplo que no debe aplicarse a la ligera, siempre previo backup y siempre adaptando los valores a cada organización, según el tipo de software que ataque el servidor de base de datos y el uso, así como el número de usuarios y el número de tablas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
[mysqld] # CONEXIONES Y THREADS max_connections = 1050 # 5% más que los 1.000 usuarios thread_cache_size = 100 # Threads en caché para reconexiones rápidas table_open_cache = 4000 # 150 tablas × 1,000 conexiones / 40 ≈ 3750 (redondeado a 4000) # MEMORIA MyISAM (prioridad baja, solo si es crítico) key_buffer_size = 2G # Reducido para dar más RAM a InnoDB myisam_sort_buffer_size = 128M # MEMORIA InnoDB (máxima prioridad) innodb_buffer_pool_size = 14G # 70% de RAM (14GB de 20GB) # Se comenta el siguiente parámetro que puede causar que no se inicie el motor InnoDB # innodb_log_file_size = 1G # Archivos de log grandes para mejor rendimiento innodb_log_buffer_size = 128M innodb_flush_log_at_trx_commit = 2 # Balance entre rendimiento y durabilidad # CACHÉS Y BUFFERS (ajustes conservadores) query_cache_size = 0 # Desactivado para alta concurrencia (puede causar bloqueos) tmp_table_size = 256M max_heap_table_size = 256M # MEMORIA POR CONEXIÓN (¡CRÍTICO!) sort_buffer_size = 1M # Ajustado al mínimo necesario read_buffer_size = 1M read_rnd_buffer_size = 1M join_buffer_size = 1M thread_stack = 192K # Reducido para ahorrar memoria # TIMEOUTS Y LIMPIEZA # Si disponemos de aplicaciones de escritorio usando esta base de datos, regularemos el # valor del siguiente parámetro hasta dejarlo apropiado para que no muestren errores de # desconexión con la base de datos cada cierto tiempo wait_timeout = 300 # Desconexión rápida de conexiones inactivas (5 minutos) interactive_timeout = 60 max_allowed_packet = 64M |