Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

ER_CON_COUNT_ERROR Linux / DevOps

Траблшутинг ошибки MySQL 1040: Too many connections и настройка thread_cache_size

Обновлено: 21.08.2026
  • Приложение возвращает ошибку SQLSTATE[08004] [1040] Too many connections.
  • Администратор не может войти в консоль MySQL под пользователем root.
  • Всплеск создания новых потоков ОС (рост Threads_created) вместо использования пула кэша.
  • Зависание базы из-за утечки незакрытых соединений от пула коннектов бекенда (Zombie connections).

1. Экстренный вход в переполненный MySQL через резервный порт админа

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

mysql --host=127.0.0.1 --port=33062 -u root -p

Если резервный порт не настроен, используйте аккаунт с привилегией CONNECTION_ADMIN (MySQL резервирует +1 подключение сверх лимита для root).

2. Оперативное увеличение лимита соединений на лету

-- Просмотр текущего максимума и пикового значения
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';

-- Временное увеличение лимита без перезагрузки
SET GLOBAL max_connections = 1000;

3. Закрытие зависших 'спящих' потоков (Sleep connections)

-- Поиск долгих неактивных коннектов
SELECT id, user, host, db, command, time, state FROM information_schema.processlist WHERE command = 'Sleep' AND time > 60 ORDER BY time DESC;

-- Завершение проблемного потока
KILL 14502;

4. Постоянная конфигурация в /etc/mysql/my.cnf

[mysqld]
# Основной пул подключений
max_connections = 1000
max_user_connections = 950

# Порт администратора для гарантированного доступа при авариях
admin_address = '127.0.0.1'
admin_port = 33062

# Кэширование потоков для снижения нагрузки на создание нитей ОС
# Формула: 8 + (max_connections / 100)
thread_cache_size = 32

# Уменьшение таймаута удержания неактивных соединений (дефолт 28800 сек = 8 часов)
wait_timeout = 300
interactive_timeout = 300

# Лимит файловых дескрипторов (должен быть в 2-3 раза больше max_connections)
open_files_limit = 65535
💡 Практика специалистов: При увеличении max_connections всегда повышайте лимит файловых дескрипторов в systemd: LimitNOFILE=65535 в /etc/systemd/system/mysql.service.d/override.conf, иначе MySQL упрется в лимит ОС на открытие сокетов.

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

Как рассчитать правильный thread_cache_size?

Сравните метрики SHOW STATUS LIKE 'Threads_created' и 'Connections'. Если Threads_created непрерывно растет при стабильном трафике, увеличьте thread_cache_size.

Почему увеличение max_connections может уронить сервер?

Каждое активное соединение аллоцирует буферы под сортировки и джойны (join_buffer_size, sort_buffer_size, read_buffer_size). Установка max_connections в нереалистичные значения (например, 10000) при нехватке RAM приведет к падению MySQL по OOM Killer.

Полезные материалы
Рекомендуем