До основного вмісту

Too many connections в MySQL: ліміти і витоки з'єднань

MySQL / MariaDB · 29.09.2026

Що означає помилка 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_connections151–500максимум одночасних підключень до сервера
wait_timeout28800секунд простою, після яких сервер закриває неактивну сесію
interactive_timeout28800те саме для інтерактивних клієнтів, наприклад 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.
← Назад до бази знань Поставити питання підтримці