#Что означает неисправность и в каких условиях возникает
Сайт внезапно получает ERROR 1040 (HY000): Too many connections, хотя число посетителей почти не изменилось. Для MySQL/Percona 8.x сначала нужно выяснить, накопились ли неосвобождённые соединения, выросла ли длительность запросов или кто-то изменил лимиты. Однократное увеличение max_connections не исправляет утечку: больше подключений означает больше потенциально занятой памяти. Начните с безопасных измерений и только потом правьте настройки приложения.
#Возможные причины: как различить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Зависшие соединения SleepПриложение открывает соединения и не возвращает их в пул либо держит транзакции открытыми. | Threads_connected растёт; в списке процессов много Sleep от одной программы. | Найти владелец подключения и исправить время жизни соединения. |
| Долгие запросы или блокировкиНагрузка по числу запросов прежняя, но время каждого выросло. | В SHOW FULL PROCESSLIST есть долгие Query, Locked или ожидания. | Проверить блокировку, запрос и индекс, не повышая лимит вслепую. |
| Изменение лимита или фоновых клиентовПосле релиза поменялись настройки пула либо появился резервный агент/задание. | Max_used_connections близко к max_connections; есть новые User/Host. | Сопоставить время релиза, фоновые службы и лимиты. |
#Пошаговая диагностика и устранение
- Подтвердите точную ошибку и времяОткройте журнал веб-приложения, найдите полную строку ERROR 1040 и отметьте время. Ошибки 2002, 2006 и 1045 имеют другие причины; без 1040 не меняйте max_connections. Определите, к какому серверу база подключается: к локальному сокету или по сети, и какой экземпляр MySQL используется.
- Откройте клиент MySQL безопасным способомНа сервере подключитесь через SSH под учётной записью администратора. Для доступного административного входа введите
sudo mysql(Debian с настроенным socket-входом) либоmysql -u имя_администратора -p;-pзапросит пароль без показа. Если оба варианта не работают, запросите у администратора доступ только на просмотр, не запускайте восстановление пароля и не останавливайте сервер. - Сравните лимит и фактическое число соединенийВ консоли с приглашением
mysql>введитеSHOW VARIABLES LIKE 'max_connections';затемSHOW GLOBAL STATUS WHERE Variable_name IN ('Threads_connected','Threads_running','Max_used_connections','Connection_errors_max_connections');.Threads_connected— текущее число соединений,Max_used_connections— максимум с запуска, а не текущий уровень. Сохраните результаты с меткой времени, повторите в пик. - Определите источники соединенийВ MySQL выполните
SHOW FULL PROCESSLIST;. Просмотрите столбцы User, Host, Command, Time, State и Info; сравните количество соединений веб-сайта и фонового обработчика. Команда показывает не все чужие потоки без PROCESS. Если отчёт пустой для чужих подключений, попросите администратора с полномочиями PROCESS провести проверку, а не выдавайте дополнительные права сайту. - Отличите спящие соединения от медленных запросовЕсли у одного User много долгоживущих Sleep, проверьте в настройках приложения размер пула, постоянные подключения и закрытие транзакций после завершения запроса. Если преобладают Query, зафиксируйте текст и время выполнения, посмотрите EXPLAIN на копии или вне пика. Не выполняйте массовый KILL: это может откатить рабочие операции.
- Проверьте изменения в момент ростаСравните время появления 1040 с развертыванием новой версии, запуском резервного копирования, задачами по расписанию и сменой конфигурации PHP-FPM. Например, рост
pm.max_childrenспособен увеличить верхнюю границу одновременных подключений даже при прежнем числе посетителей. Проверьте журнал развёртывания и настройки пулов; откатите подозрительное изменение приложения через обычную процедуру развёртывания. - Исправьте первопричину в приложенииРазработчику следует закрывать курсоры и транзакции, освобождать соединение в блоке
finallyи установить ограниченный размер пула, соответствующий параллельным запросам. Проверьте исправление на испытательном экземпляре тем же набором запросов. Если подключений становится меньше и число ошибок падает, разворачивайте исправление в малой группе с наблюдением за временем ответа. - Повышайте лимит только после расчёта памятиЕсли утечек нет, а измеренная максимальная потребность выросла по допустимой причине, согласуйте новый
max_connectionsс администратором БД после оценки памяти на соединение и серверных лимитов. Сначала зафиксируйте прежнее значение и способ отката; на загруженном сервере не задавайте большое число только ради исчезновения ошибки, поскольку это может привести к нехватке ОЗУ. - Дополнительная команда по темеSQLКомандаSQL-команды вводят внутри mysql> с правом просмотра; PROCESS нужен для просмотра всех чужих потоков.
SHOW VARIABLES LIKE 'max_connections';SHOW GLOBAL STATUS WHERE Variable_name IN ('Threads_connected','Threads_running','Max_used_connections','Connection_errors_max_connections');SHOW FULL PROCESSLIST;
#Как проверить исправление и что делать, если оно не помогло
В очередной пик зафиксируйте значение Threads_connected, отсутствие новых ERROR 1040 и продолжительность запросов. Если при стабильной нагрузке соединения снова накапливаются, снимите несколько последовательных списков процессов и обратитесь к разработчику; изменение max_connections верните к прежнему значению после тестов, если роста соединений не требовалось.