Що означає помилка Too many connections
MySQL відхиляє нове підключення з помилкою Too many connections, коли кількість активних сесій досягає ліміту max_connections. Сервер резервує одне додаткове підключення для користувача з правом SUPER, тому адміністратор зазвичай може увійти і розібратися, навіть коли звичайні клієнти вже отримують відмову.
Помилка рідко означає, що сайту справді потрібно більше з'єднань: найчастіше це симптом витоку — застосунок відкриває підключення швидше, ніж закриває.
Як подивитися поточний ліміт і навантаження
Перш ніж змінювати ліміт, варто зрозуміти, скільки з'єднань реально відкрито і хто їх тримає.
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
SHOW PROCESSLIST;Стовпець Time у SHOW PROCESSLIST показує, скільки секунд сесія перебуває в поточному стані. Якщо у багатьох рядків стан Sleep і Time вимірюється сотнями секунд, це майже завжди витік з'єднань на боці застосунку.
Ключові параметри лімітів з'єднань
| Параметр | Типове значення | За що відповідає |
|---|---|---|
| max_connections | 151–500 | максимум одночасних підключень до сервера |
| wait_timeout | 28800 | секунд простою, після яких сервер закриває неактивну сесію |
| interactive_timeout | 28800 | те саме для інтерактивних клієнтів, наприклад mysql CLI |
Зниження wait_timeout до 60–120 секунд для вебнавантаження допомагає закривати завислі з'єднання швидше, не чекаючи стандартних восьми годин. Підбір інших параметрів описано у статті про налаштування my.cnf.
Звідки беруться витоки з'єднань у застосунку
- Скрипт відкриває з'єднання з базою і завершується з помилкою до виклику close — з'єднання висить до завершення wait_timeout.
- Пул з'єднань налаштований з більшим розміром, ніж реально потрібно застосунку, і тримає зайві сесії відкритими про запас.
- Довгий SELECT без LIMIT блокує потік на хвилини, а нові запити відкривають нові підключення поверх старих.
- Кілька копій застосунку (воркери, крон-задачі) тримають свої пули, і сумарно вони перевищують ліміт сервера.
Як правильно налаштувати пул з'єднань
Пул з'єднань розв'язує проблему лише тоді, коли його розмір узгоджений з лімітом сервера, а не обраний навмання.
# Приклад для застосунку з кількома воркерами:
# 4 воркери x pool_size 20 = 80 з'єднань
# max_connections на сервері має бути помітно більшим за 80
max_connections = 200Правило просте: сумарний розмір усіх пулів на всіх воркерах застосунку повинен бути меншим за max_connections із запасом на службові підключення — моніторинг, резервні копії, ручні сесії адміністратора.
Екстрені заходи при переповненні ліміту
Якщо помилка Too many connections вже йде на проді, діяти потрібно швидко і за порядком.
- Увійти під обліковим записом з правом SUPER — для нього зарезервоване окреме підключення.
- Через SHOW PROCESSLIST знайти сесії з найбільшим Time у стані Sleep і завершити їх командою KILL.
- Тимчасово підняти max_connections через SET GLOBAL, не чекаючи перезапуску сервера.
- Перевірити журнал повільних запитів, щоб знайти запит, який тримає з'єднання довше за всіх.
SET GLOBAL max_connections = 300;
KILL 12345;Підсумок: чек-лист щодо помилки Too many connections
- Перевірити поточний max_connections і реальну кількість підключень через Threads_connected.
- Знайти завислі сесії в SHOW PROCESSLIST за великим значенням Time.
- Знизити wait_timeout для вебнавантаження, якщо сесії накопичуються в Sleep.
- Звести сумарний розмір пулів застосунку з лімітом сервера.
- При масштабуванні навантаження на читання розглянути ProxySQL замість нескінченного зростання max_connections.