Сайт, который ещё вчера работал нормально, вдруг показывает «Database Error» или «Error establishing a database connection», а через час сам восстанавливается. На следующий день всё повторяется. Одна из частых причин такой «плавающей» ошибки — почасовой лимит подключений, установленный для пользователя MySQL. В логах он виден под именем max_connections_per_hour, и если один раз разобраться в механизме, в следующий раз проблему можно определить за пару минут.
Что на самом деле означает ошибка 1226
MySQL позволяет задавать для каждого пользователя лимиты ресурсов: сколько запросов, изменений и новых подключений он может сделать за час. Если за час пользователь превысил разрешённое число подключений, сервер отклоняет новые соединения и возвращает сообщение:
ERROR 1226 (42000): User 'shop_user' has exceeded the
'max_connections_per_hour' resource (current value: 50)
Важно понимать, что лимит считает не одновременные подключения, а все подключения, открытые за час. На PHP-сайтах обычно каждое открытие страницы создаёт новое соединение с базой. Значит, при лимите 50 сайт перестаёт работать примерно после 50 просмотров страниц в час. Счётчик обнуляется по истечении часа, поэтому кажется, что ошибка прошла сама, но с возвращением трафика она появляется снова.
Как отличить её от других ошибок подключения
У MySQL есть несколько похожих ошибок подключения, и путать их не стоит, потому что решения разные. 1226 означает, что исчерпана почасовая квота. Ошибка 1203, то есть max_user_connections, говорит о превышении числа одновременных соединений пользователя. 1040 Too many connections означает, что заполнен общий лимит всего сервера, и обычно это не связано с одним пользователем. При неверном пароле или имени пользователя появляется 1045 Access denied.
Посетителю сайт чаще всего показывает только общую страницу «ошибка базы данных», а точный код записывается в лог ошибок PHP или в собственный лог сайта. Открыть раздел логов в панели хостинга или файл error_log в папке сайта и найти код ошибки — первый шаг диагностики.
Проверка текущих лимитов
Если у вас есть административный доступ к MySQL, например на собственном VPS, лимиты пользователя можно посмотреть в таблице mysql.user. Столбец max_connections хранит именно почасовой лимит подключений, а max_user_connections отвечает за одновременные соединения. Значение 0 означает отсутствие лимита:
SELECT user, host, max_questions, max_updates,
max_connections, max_user_connections
FROM mysql.user
WHERE user = 'shop_user';
На виртуальном хостинге обычный пользователь доступа к этой таблице не имеет. В этом случае значение лимита и возможность его изменить нужно уточнить у технической поддержки хостинга.
Увеличение лимита и сброс счётчика
Администратор сервера меняет лимит командой ALTER USER. Для современных сайтов 50 подключений в час — очень мало, поэтому обычная практика — поднять значение до тысяч или снять ограничение совсем. Чтобы сразу обнулить счётчик после изменения, используется FLUSH USER_RESOURCES, иначе придётся ждать окончания текущего часа:
ALTER USER 'shop_user'@'localhost'
WITH MAX_CONNECTIONS_PER_HOUR 20000;
FLUSH USER_RESOURCES;
Чтобы полностью снять ограничение, указывают значение 0. Но на виртуальном хостинге лимиты нужны ещё и для того, чтобы один клиент не занял весь сервер, поэтому чаще выбирают не безлимит, а высокое значение с запасом под реальный трафик сайта. На своём VPS это решение принимаете вы сами.
Как уменьшить число подключений
Увеличение лимита — быстрое решение, но если сайт открывает тысячи соединений в час, полезно понять причину. Часто основную часть подключений создают не реальные посетители, а боты, слишком частые задания по расписанию или тяжёлые страницы без кеша. Проверьте следующие моменты:
- Включён ли кеш страниц: страница из кеша вообще не обращается к базе, и число подключений резко падает.
- Нет ли в журнале доступа поисковых и аналитических ботов, которые без остановки запрашивают одни и те же страницы — их можно ограничить на уровне сайта.
- Не запускаются ли задания
cronкаждую минуту — во многих случаях хватает интервала в пять или пятнадцать минут. - На сайтах WordPress запросы
admin-ajax.phpрегулярно отправляются даже из забытой открытой вкладки админ-панели.
Пример из практики: обеденные сбои сайта клиники
Сайт частной клиники в Самарканде example.uz каждый день ближе к обеду примерно на час переставал работать. Именно в это время чаще всего использовались расписание приёма врачей и форма онлайн-записи, а администратор считал, что виноват медленный хостинг. В логе ошибок PHP нашлись подряд идущие записи с кодом 1226, а журнал доступа показал несколько сотен открытых страниц за час — намного больше лимита в 50.
Техподдержка подняла лимит пользователя до значения, соответствующего масштабу сайта, и сбросила счётчик. Владелец сайта включил кеш страниц и перевёл задание обновления расписания с каждой минуты на каждые десять минут. В итоге ошибка полностью исчезла, а страницы стали открываться быстрее. На хостинге sayt.uz в такой ситуации достаточно открыть тикет в кабинете и указать код ошибки.
Чтобы проблема не вернулась
Почасовой лимит чаще всего впервые проявляется тогда, когда сайт растёт и трафик увеличивается. Поэтому перед рекламной кампанией или сезонной акцией полезно заранее убедиться, что лимиты подключений к базе выдержат ожидаемую нагрузку. Еженедельный просмотр лога ошибок, проверка работы кеша и ограничение лишних ботов защищают сайт от таких неожиданных сбоев.