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

> Що означає помилка Too many connections в MySQL, як перевірити ліміт max_connections і знайти витоки з'єднань у коді.

## Що означає помилка 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](https://www.zevshost.net/uk/kb/mysql-my-cnf-optimizatsiya/).

## Звідки беруться витоки з'єднань у застосунку

- Скрипт відкриває з'єднання з базою і завершується з помилкою до виклику 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, не чекаючи перезапуску сервера.
- Перевірити [журнал повільних запитів](https://www.zevshost.net/uk/kb/mysql-slow-query-log/), щоб знайти запит, який тримає з'єднання довше за всіх.

```
SET GLOBAL max_connections = 300;
KILL 12345;
```

## Підсумок: чек-лист щодо помилки Too many connections

- Перевірити поточний max\_connections і реальну кількість підключень через Threads\_connected.
- Знайти завислі сесії в SHOW PROCESSLIST за великим значенням Time.
- Знизити wait\_timeout для вебнавантаження, якщо сесії накопичуються в Sleep.
- Звести сумарний розмір пулів застосунку з лімітом сервера.
- При масштабуванні навантаження на читання розглянути [ProxySQL](https://www.zevshost.net/uk/kb/proxysql-balansirovka/) замість нескінченного зростання max\_connections.

---

Джерело: https://www.zevshost.net/uk/kb/mysql-too-many-connections/
