Траблшутинг ошибки MySQL 1040: Too many connections и настройка thread_cache_size
- Приложение возвращает ошибку
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 Частые вопросы (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.