Error 1040 Too many connections — ошибка, которая возникает при превышении максимального количества возможных подключений к серверу баз данных со стороны скриптов сайта.
Устраняется, как правило, увеличением лимита в конфигурации сервера.
Обычно превышением количества соединений проявляется как прекративший работать сайт. Ошибку можно увидеть попробовав подключиться к базе данных с реквизитами пользователя, от имени которого работает сайт.
mysql -u USERNAME -p
Enter password:
ERROR 1040 (08004): Too many connections
От имени суперпользователя подключиться удастся в случае если сайт работает не от root.
mysql -u root -p
Лимит существует для пользователя, если сайт работает от root (что именно из-за этого является плохой практикой) и появилась такая ошибка — требуется перезапуск службы MySQL через systemctl restart mysql.
Если удалось зайти в консоль MySQL проверяем актуальное значение директивы max_user_connection. В данном случае нас интересует прежде всего оно.
show status like '%connected%';
+-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 151 | +-------------------+-------+ 1 row in set (0.01 sec)
А также действующий лимит
show global variables like '%connections%';
+----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | max_connections | 151 | | max_user_connections | 0 | +----------------------+-------+ 2 rows in set (0.00 sec)
Лимит достигнут, скрипты при этом продолжают делать запросы. Исправить ситуацию можно добавив в /etc/mysql/my.cnf такую строку
max_user_connection=500
Параметр может задавать не только в /etc/mysql/my.cnf, но и в любом файле, который подключается в /etc/mysql/my.cnf. Главное блок, в который добавляются настройки, он должен определяться директивой [mysqld].
Пример приведен на скриншоте
Затем перезапустив MySQL
systemctl restart mysql
Без перезапуска того же результата можно добиться установив новое значение глобальной переменной, от имени root в консоли MySQL это делается таким образом:
set global max_connections = 500;
Значение будет в силе пока работает процесс MySQL — до следующего перезапуска. Установку глобальной переменной в консоли можно использовать как временное решение. На постоянно изменить значение можно только в конфигурационном файле с последующим перезапуском службы.
Лимит теперь увеличен и сайт должен вновь стать доступен.
Часто причиной является большая активность аудитории и длительные запросы на изменение данных. Они протекают с блокировками, если используются таблицы типа MyISAM получить значительное улучшение можно конвертировав их в InnoDB.
Читайте также про оптимизацию настроек MySQL.