В логах ошибок PHP иногда можно встретить записи типа MySQL Server Has Gone Away (error 2006). Они означают, что соединение с сервером баз данных (ожидание сессии) прервалось по таймауту. Ошибку можно легко исправить.
Как исправить ошибку MySQL Server Has Gone Away
Ошибка MySQL Server Has Gone Away (error 2006) может возникнуть в двух случаях:
- Соединение с MYSQL прерывается по таймауту, передача данных не успевает завершится в рамках сессии.
- Пакет, который передается слишком большой или некорректный
Также можно установить значения в консоли MySQL авторизовавшись как пользователь root, однако в этом случае значения будут действовать только до перезапуска сервиса.
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.