Бесплатный экспресс-аудит сайта Безопасность, SEO, AI-поиск и 152-ФЗ — отчёт с баллами за минуту Проверить сайт
Обсудить проект

MySQL server has gone away: обрыв соединения при долгих операциях

Текст ошибки:

MySQL server has gone away

Иногда рядом появляется Lost connection to MySQL server during query — это тот же случай.

Две причины

Пакет больше разрешённого

Параметр max_allowed_packet ограничивает размер одного запроса. Импорт каталога, обмен с 1С и загрузка больших описаний легко его превышают. База обрывает соединение, не объясняя причину.

Соединение простояло слишком долго

Параметр wait_timeout закрывает соединение, которое долго молчит. Скрипт обмена может готовить данные дольше, чем разрешено молчать, — и возвращается к уже закрытому соединению.

Что настроить

  1. Увеличьте max_allowed_packet до размера, который покрывает ваши пакеты обмена.
  2. Увеличьте wait_timeout и interactive_timeout с запасом относительно самой долгой операции.
  3. Перезапустите службу базы данных, чтобы значения применились.
  4. Проверьте, что консольный PHP использует те же настройки: обмен часто идёт через задания cron, а у них свой файл настроек.

Эти параметры правятся в конфигурации сервера базы данных, поэтому нужен доступ администратора. На виртуальном хостинге их меняет поддержка хостинга по запросу.

Если обмен большой

Настройки лечат симптом, но обмен на сотни тысяч позиций правильнее дробить: уменьшить размер порции в настройках обмена, чтобы один шаг укладывался в лимиты. Так же обмен переживёт и обрыв связи — упадёт одна порция, а не весь процесс. Подробнее про настройку обмена — в инструкции про обмен сайта с 1С.

Частые вопросы

Это ошибка Битрикса или сервера?

Сервера базы данных. Битрикс лишь сообщает, что соединение оборвалось посреди работы. Поэтому и лечится она настройками MySQL, а не продукта.

Почему падает только обмен с 1С, а сайт работает?

Обмен передаёт большие пакеты данных и держит соединение долго — он первым упирается в оба лимита. Обычные страницы делают короткие запросы и проблемы не замечают.

Увеличили лимиты, всё равно падает.

Проверьте, не падает ли сама база по нехватке памяти: в этом случае соединение рвётся потому, что службу останавливает система. В журнале базы будет видно, что она перезапускалась.