MySQL: Too many connections
Сообщение Too many connections означает, что база достигла предела одновременных подключений. Служба при этом работает, но новые клиенты получают отказ. Причины делятся на две: предел действительно мал или соединения не закрываются.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Предел подключений мал для нагрузки
Значение по умолчанию (обычно 151) рассчитано на скромное использование. Приложение с пулом соединений на несколько серверов исчерпывает его быстро.
-
Приложение не закрывает соединения
Утечка соединений выглядит как медленный рост числа подключений до предела. После перезапуска приложения всё приходит в норму — и это главный признак.
-
Предел дескрипторов службы ниже числа соединений
MySQL не сможет принять больше соединений, чем позволяет предел дескрипторов, даже если настройка базы разрешает.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Текущее и максимальное за время работы число соединений.
mysql -e "SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Max_used_connections';"Кто именно держит соединения и в каком состоянии.
mysql -e 'SHOW PROCESSLIST;' | head -30Предел дескрипторов службы.
systemctl show mysql -p LimitNOFILEРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Значение по умолчанию (обычно 151) рассчитано на скромное использование. Приложение с пулом соединений на несколько серверов исчерпывает его быстро.
- Как проверить
-
Посмотрите предел и текущее число соединений.
mysql -e "SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null
- Как исправить
-
Поднимите предел и убедитесь, что предела дескрипторов у службы хватает: каждое соединение расходует дескриптор.
sudo systemctl edit mysql # [Service]\nLimitNOFILE=65535
- Почему происходит
- Утечка соединений выглядит как медленный рост числа подключений до предела. После перезапуска приложения всё приходит в норму — и это главный признак.
- Как проверить
-
Посмотрите список соединений и их состояние.
mysql -e 'SHOW PROCESSLIST;' 2>/dev/null | head -20
- Как исправить
-
Разбирайтесь с приложением: пул соединений должен переиспользовать подключения. Как временная мера помогает
wait_timeoutпоменьше.
- Почему происходит
- MySQL не сможет принять больше соединений, чем позволяет предел дескрипторов, даже если настройка базы разрешает.
- Как проверить
-
Сравните два предела.
systemctl show mysql -p LimitNOFILE mysql -e "SHOW VARIABLES LIKE 'open_files_limit';" 2>/dev/null
- Как исправить
-
Поднимите
LimitNOFILE=в unit-файле: MySQL при старте подстраивает свой предел под системный.
Пример вывода
Предел подключений исчерпан. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
mysqld[1200]: [Warning] [MY-010055] [Server] IP address '<адрес>' could not be resolved
mysqld[1200]: [ERROR] [MY-010914] [Server] Too many connections
# со стороны приложения:
app[4100]: ERROR 1040 (HY000): Too many connections
Связанные ошибки
- Too many open files в журнале службы Служба исчерпала лимит файловых дескрипторов. Как правильно поднять LimitNOFILE и когда дело в утечке.
- status=205/LIMITS в systemd Код 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- MySQL: Can't connect to local server through socket Клиент не находит unix-сокет MySQL: сервер не запущен, путь к сокету другой, каталог в /run не создан.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- php-fpm: server reached pm.max_children setting Пул php-fpm исчерпал рабочие процессы: сайт отвечает медленно или отдаёт 502. Как считать pm.max_children.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
Где встречается чаще всего
Источники
- Документация MySQL: too many connections
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено при max_connections=5 и пуле приложения на 20 соединений.