MySQL. Ошибка "MySQL server has gone away" (error 2006) что это такое и как исправить?

15.07.2020 Софт

Рассмотрим что такое ошибка "MySQL server has gone away" (error 2006)  почему она возникает и как ее исправить.

Наиболее часто ошибка "MySQL server has gone away" (error 2006) возникает в результате тайм-аута соединения и его принудительно закрытия сервером MySQL. По умолчанию MySQL сервер закрывает соединение если нет никакого взаимодействия с ним по прошествии времени указанном в параметре wait_timeout, параметр wait_timeout это время бездействия (таймаут) который указывается в секундах в настройках my.cnf. 

Причины ошибки

1) Сервер закрыл соединение по таймауту, так как к нему не было обращений. Для устранения этой причины есть несколько способов:

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

Для этого мы открываем файл my.cnf и редактируем его при помощи вызова следующей команды:

sudo nano /etc/mysql/my.cnf

устанавливаем значение wait_timeout = 600 (значение задается в секундах, если ошибка не пропадет увеличиваем значение переменной, до тех пор пока ошибка не пропадет). , после этого нужно рестартануть MySQL.

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

Второй способ. Второй способ заключается в том что бы в вашем коде проверять открыто соединение с сервером MySQL или нет. И если соединение с сервером закрыто, то открывать его снова. Данный случай может быть тогда когда вы открываете соединение с сервером и делаете долгие вычисления или обращаетесь к стороннему сервису и ждете от него ответа. Время потраченное на вычисления или обращение к стороннему сервису может быть больше чем указано в wait_timeout, поэтому вам придется снова открывать соединение. Если этого не делать, то вы снова будете получать ошибку  "MySQL server has gone away" (error 2006).

2) Сервер сбрасывает (отклоняет) неправильные или слишком большие пакеты. Если сервер MySQL получает пакет данных, который слишком большой или не корректный, он думает что что-то пошло не так или с клиентом случилась какая-то беда и закрывает соединение. И в вашем скрипте вы можете получить ошибку "Error while sending QUERY packet".  Часто такая ошибка возникает при импорте дампов содержащих большие данные, например очень большие текстовые данные или бинарные.

Исправить это можно следующем образом:

Первый способ. Вы можете увеличить максимальный размер пакета увеличив значение max_allowed_packet в файле my.cnf.

Для этого мы открываем файл my.cnf и редактируем его при помощи вызова следующей команды:

sudo nano /etc/mysql/my.cnf

и установить max_allowed_packet = 128M (если ошибка не пропадет поиграйтесь с этим значением, чтобы найти оптимальное), после этого нужно рестартануть MySQL.

Второй способ. Если необходимо выполнять объемные запросы (например, при работе с большими столбцами типа BLOB), можно увеличить предельный размер запроса, запустив mysqld с опцией -O max_allowed_packet=# (по умолчанию 1 Mб). Дополнительная память будет выделяется по требованию, так что сервер будет использовать больше памяти только в случае, когда выдан большой запрос или когда mysqld должен возвратить большую строку результата!