Error mysql server has gone away


В логах ошибок PHP иногда можно встретить записи типа MySQL Server Has Gone Away (error 2006). Они означают, что соединение с сервером баз данных (ожидание сессии) прервалось по таймауту. Ошибку можно легко исправить.


Как исправить ошибку MySQL Server Has Gone Away


Ошибка MySQL Server Has Gone Away (error 2006) может возникнуть в двух случаях:

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

Error mysql server has gone away


Быстрым решением является увеличение значений двух глобальных переменных MySQL. Делается это в основном конфигурационном файле сервера баз данных /etc/mysql/my.cnf или в одном из файлов, которые подключаются в /etc/mysql/my.cnf и помощью директивы include. Самое главное — параметры нужно задавать в секции [mysqld] конфигурационного файла.


Также можно установить значения в консоли MySQL авторизовавшись как пользователь root, однако в этом случае значения будут действовать только до перезапуска сервиса.

 
В консоли это выглядит так:

set @@GLOBAL.max_allowed_packet=96000000;
set @@GLOBAL.wait_timeout=1000;


Решение с внесением изменений в файл /etc/mysql/my.cnf расписано ниже, для обеих возможных причин ошибки.


ВАРИАНТ 1 — Таймаут соединения С БД


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

Лучше всего выяснить почему такие запросы имеют место и оптимизировать их, но для того чтобы получить мгновенный результат нужно увеличить значение параметра wait_timeout. Значение задается в секундах и не может быть более 28800.


mcedit /etc/mysql/my.cnf

wait_timeout = 1000


После внесения любых изменений в конфигурационный файл перезапускаем MySQL

systemctl restart mysql



ВАРИАНТ 2 — СЛИШКОМ Большой пакет


Несколько другая ситуация имеет место когда сервер отклоняет пакет из-за его слишком большого размера (или в случае если сервер не может распознать пакет по той или иной причине). В логи при этом пишутся точно такие же сообщения.



Решение в этом случае практически такое же — необходимо скорректировать значение одной переменной в конфигурационном файле.


mcedit /etc/mysql/my.cnf

[mysqld]
max_allowed_packet = 96M



В примере задан максимальный размер пакета, который сервер не будет отвергать — 96 Мб. Устанавливать слишком большие значения не стоит.


Также перезапускаем MySQL

systemctl restart mysql

Таким образом, РНР ошибка mysql server has gone away в большинстве случаев побеждается корректировкой значений двух переменных и перезапуском сервера баз данных.


Читайте также про оптимизацию MySQL.

Сказать спасибо