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

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:

Y ejecutando el comando:

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:

Y ejecutar el comando:

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:

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:

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:

Y ejecutaremos el siguiente comando para ampliar el límite de max_connections a 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:

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:

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.