Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
MYSQL-ERR-1040 Linux / DevOps

MySQL Ошибка 1040 (08004): Too many connections (Лимит max_connections)

Обновлено: 21.08.2026  ·  Официальная база знаний

Архитектура пула соединений и управления потоками в MySQL

Для каждого входящего клиентского TCP/Unix-подключения сервер MySQL создает или выделяет из кэша потоков (Thread Cache) отдельный рабочий поток (Thread-per-connection model). Системная переменная max_connections устанавливает жесткий верхний предел одновременно обслуживаемых соединений. Когда число активных клиентских сессий достигает значения max_connections, сервер начинает отклонять все последующие попытки авторизации с критической ошибкой:

«ERROR 1040 (08004): Too many connections»

При этом для учетных записей с административной привилегией CONNECTION_ADMIN или SUPER резервируется ровно одно дополнительное соединение (max_connections + 1) для возможности экстренного входа администратора.

Бизнес-риски

Полный каскадный отказ веб-приложений (HTTP 500 Database Connection Failed), зависание транзакций, невозможность совершения покупок в интернет-магазинах.

Факторы, провоцирующие исчерпание лимита соединений

ФакторМеханизм влиянияРешение
Зависшие соединения (Sleep)Клиенты держат открытые сессии без отправки запросов.Уменьшение wait_timeout и interactive_timeout.
Медленные SQL-запросыЗапросы выполняются секундами, соединения накапливаются в очереди.Оптимизация индексов, включение Slow Query Log.
Отсутствие Connection PoolingКаждый PHP/Python воркер открывает собственное соединение.Внедрение пулера (ProxySQL, HAProxy).

Регламент экстренного восстановления доступа и оптимизации лимитов

Шаг 1: Экстренное подключение администратора и анализ процессов

Если сервер отклоняет подключения, подключитесь под суперпользователем или через специальный административный порт (в MySQL 8.0):

# 1. Экстренное подключение под root:
mysql -u root -p

-- 2. Просмотр текущего распределения соединений по статусам:
SHOW PROCESSLIST;

-- 3. Анализ количества подключений в реальном времени:
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
SHOW VARIABLES LIKE 'max_connections';

Шаг 2: Динамическое увеличение лимита max_connections без перезапуска

-- 1. Увеличение лимита соединений на лету (например, до 500):
SET GLOBAL max_connections = 500;

-- 2. Уменьшение таймаута простоя зависших 'Sleep' соединений (до 60 секунд вместо 28800 по умолчанию!):
SET GLOBAL wait_timeout = 60;
SET GLOBAL interactive_timeout = 60;

-- 3. Персистентное сохранение в my.cnf:
-- sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
-- [mysqld]
-- max_connections = 500
-- wait_timeout = 60
-- interactive_timeout = 60

Шаг 3: Настройка выделенного административного порта (MySQL 8.0+)

Задайте независимый сетевой интерфейс, который гарантированно ответит администратору даже при 100% занятости основного пула:

# В конфигурационном файле my.cnf:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
admin_address = 127.0.0.1
admin_port = 33062
create_admin_listener_thread = 1

# Теперь вход администратора ВСЕГДА доступен по порту 33062:
# mysql -u root -h 127.0.0.1 -P 33062 -p

Типовые ошибки администраторов

  • Установка max_connections = 5000 без учета RAM: Каждое соединение выделяет персональные буферы (sort_buffer_size, read_buffer_size, join_buffer_size). При 5000 соединений сервер попытается выделить терабайты RAM и упадет по OOM.
  • Использование постоянных соединений (pconnect) в PHP без пулера: mysqli_pconnect удерживает соединения открытыми навсегда, быстро исчерпывая лимит при росте числа воркеров FPM.
База данных регулярно падает с ошибкой Too many connections в часы пик?
Инженеры ITSTM внедрят отказоустойчивый пулер соединений ProxySQL, проведут тюнинг буферов памяти и ликвидируют медленные запросы.
Практический опыт инженера: Для архитектур с сотнями микросервисов обязательно используйте промежуточный балансировщик ProxySQL с мультиплексированием соединений (Connection Multiplexing). Это позволяет обслуживать 10 000 веб-клиентов всего через 100 реальных соединений к MySQL.

Частые вопросы (FAQ)

Как безопасно рассчитать максимальное значение max_connections?

Формула: max_connections <= (Доступная RAM - innodb_buffer_pool_size) / (Размер буферов сессии: sort_buffer + read_buffer + join_buffer + 2MB на поток).

Как принудительно убить все 'Sleep' процессы одной командой?

Используйте pt-kill из Percona Toolkit: pt-kill --match-command Sleep --idle-time 30 --kill --interval 5.

Что означает параметр thread_cache_size?

Он указывает, сколько освободившихся потоков сервер сохраняет в памяти для повторного использования новыми клиентами, предотвращая дорогостоящие операции создания потоков ядра.

Почему лимит max_connections сбрасывается в 214 при старте?

Если системный лимит открытых файловых дескрипторов (ulimit -n / LimitNOFILE в systemd) слишком мал, MySQL автоматически снижает max_connections до допустимого системой максимума.