Ошибка 2006 или server has gone away

Эта ошибка означает, что MySQL сервер запущен, но он отказывает вам в соединении. Это может произойти по нескольким причинам. Самых основных и часто встречающихся причин три: сервер перегружен, и у вас истекло время ожидания ответа, ваш клиент отправил слишком большой пакет или сервер был не до конца проинициализирован.

В этой небольшой статье мы рассмотрим более подробно, почему возникает ошибка 2006: MySQL server has gone away, а также — как её исправить.

Такую ошибку вы можете увидеть во время подключения к базе данных с помощью PHP, консольного клиента или, например, в PhpMyAdmin:

1. Истекло время ожидания

Как я уже писал выше, одной из причин может быть таймаут ожидания соединения. Возможно, сервер баз данных перегружен и не успевает обрабатывать все соединения. Вы можете подключиться к серверу с помощью консольного клиента, если вам это удастся, и попытаться выполнить какой-либо запрос, чтобы понять, действительно ли запросы выполняются слишком долго. Если это так, можно оптимизировать производительность MySQL с помощью скрипта MySQLTuner.

В большинстве случаев надо увеличить размер пула движка InnoDB с помощью параметра innodb_buffer_pool_size. Какое значение лучше поставить, можно узнать с помощью указанного выше скрипта. Например, 800 мегабайт:

sudo vi /etc/mysql/my.cnf

innodb_buffer_pool_size=800M

Есть и другой путь решения этой проблемы. Если такая скорость обработки запросов считается нормальной, можно увеличить время ожидания ответа от сервера. Для этого измените значение параметра wait_timeout. Это время в секундах, на протяжении которого надо ждать ответа от сервера. Например:

wait_timeout=600

После любых изменений не забудьте перезапустить MySQL сервер:

sudo systemctl restart mysql

или:

sudo systemctl restart mariadb

2. Слишком большой пакет

Если ваш клиент MySQL создаёт слишком большие пакеты с запросами к серверу, это тоже может стать причиной такой ошибки. Максимально доступный размер пакета можно увеличить с помощью параметра max_allowed_packet. Например:

sudo vi /etc/mysql/my.cnf

max_allowed_packet=128M

Обратите внимание, что если вы из своей программы отправляете большие пакеты, то, скорее всего, вы делаете что-то не так. Не надо генерировать запросы к MySQL с помощью циклов for. SQL — это отдельный язык программирования, который многое может сделать сам, без необходимости писать очень длинные запросы.

3. Сервер неверно проинициализирован

Такая проблема может возникать при разворачивании контейнера MySQL или MariaDB в Docker. Дело в том, что на первоначальную инициализацию контейнера нужно много времени: около нескольких минут. Если вы не дадите контейнеру завершить инициализацию, а остановите его и потом снова запустите, то база данных будет всегда возвращать такую ошибку.

Вам нужно полностью удалить данные контейнера с базой данных. Например, с помощью docker-compose:

docker-compose down

или вручную:

docker rm mysql-container

Здесь mysql-container — это имя контейнера с базой данных. А затем надо удалить хранилище (volume) с некорректно проинициализированной базой. Сначала посмотрите список всех хранилищ:

docker volume ls

Затем удалите нужное:

docker volume rm имя_хранилища

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

Выводы

В этой небольшой статье мы рассмотрели, что значит ошибка MySQL Server has gone away, а также как её исправить на сервере или в контейнере Docker. Вы знаете ещё другие причины и решения этой проблемы? Пишите в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

Рассмотрим, как исправить ошибку MySQL server has gone away (error 2006), которая появляется при обращении к сервису MySQL.

Наиболее распространение причины ошибки MySQL server has gone away:

  • Слишком большой размер пакета в запросе к MySQL (по умолчанию максимальный размер — 16 Мб);
  • Закончилась свободная оперативная память (RAM) на сервере MySQL (проверить свободную память в Linux можно с помощью команды free –h)
  • Неактивное соединение между вашим приложением и MySQL (по умолчанию сессия разрывается через 8 часов).

ошибка mysql server has gone away (error 2006)

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

Рассмотрим, как исправить ошибку MySQL server has gone away (error 2006), которая появляется при обращении к сервису MySQL.

Наиболее распространение причины ошибки MySQL server has gone away:

  • Слишком большой размер пакета в запросе к MySQL (по умолчанию максимальный размер — 16 Мб);
  • Закончилась свободная оперативная память (RAM) на сервере MySQL (проверить свободную память в Linux можно с помощью команды free –h)
  • Неактивное соединение между вашим приложением и MySQL (по умолчанию сессия разрывается через 8 часов).

General error: 2006 MySQL server has gone away
Error Code: 2013. Lost connection to MySQL server during query
PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

Чтобы увеличить таймаут для подключений к MySQL, нужно добавить следующие опции в конфигурационный файл mysqld.cnf:

sudo nano /etc/mysql/my.cnf

Найдите секцию [mysqld] и увеличьте таймаут до 24 часов:

wait_timeout = 86400
interactive_timeout = 86400

Если вы загружаете в MySQL большие файлы или BLOB объекты более 16 Мб, то MySQL с настройками по-умолчанию также может вернуть ошибку MySQL server has gone away. Нужно увеличить максимальный размер пакета в my.cnf.

Для этого в секции [mysqld] увеличьте значение параметра max_allowed_packet со стандартного 16M до 128MB:

max_allowed_packet = 128MB

После внесения изменений в файл mysqld.cnf нужно перезапустить сервис MySQL:

  • В CentOS/RHEL:sudo systemctl restart mysqld
  • В Ubuntu: sudo systemctl restart mysql.service

Если вы подключаетесь к MySQL из PHP, проверьте что значения таймаутов в php.ini больше, чем в MySQL

mysql.connect_timeout=86400
mysql.allow_persistent=1

Недавно столкнулся с такой проблемой и решил здесь поделиться решением, которое

нашел в интернете

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

CIBlockElement::GetList

выдавало ошибку «MySQL server has gone away».
Не сразу понял в чем дело, но в итоге разобрался — MySQL сбрасывал соединение, т.к. долго не было подключения к базе после подключения к серверу (или как-то так, не силен в терминологии).
В общем решение вот такое — в файле «bitrix/php_interface/after_connect.php» нужно добавить строку:

$DB->Query("SET wait_timeout=28800");

Число в скобках — это количество секунд ожидания подключения.

Ошибка 2006 под названием MySQL Sever has gone away означает отказ сервера в соединении даже при условии, что он запущен. Известно всего три причины, почему ошибка появляется. Первая причина – сервер перегружен. Время ожидания истекло. Вторая причина – клиент отправил слишком больной пакет. Третья – сервер не был до конца проинициализирован. Дальше подробно рассмотрим, по каким причинам появляется ошибка и как с ней бороться.

Как исправить ошибку

Обычно ошибка появляется при попытке подключиться к базе данных при помощи PHP, консольного клиента, а также в случае использования PhpMyAdmin:

PhpMyAdmin

Давайте дальше рассмотрим каждую ситуацию в отдельности.

Истекло время ожидания

Как было сказано в начале статьи, одна из возможных причин – истечение времени ожидания. Может быть так, что сервер был перегружен и не справляется с нагрузкой – обработкой всех соединений. Чтобы понять, насколько долго выполняются серверные запросы, можно воспользоваться любым консольным клиентом и подключиться к серверу. Если вам удастся это сделать, выполните любой запрос. Если на обработку запросов уходит слишком много времени, оптимизировать  MySQL можно при помощи специального скрипта MySQLTuner. Обычно увеличивается размер пула движка InnoDB путем установки параметра innodb_buffer_pool_size. Оптимальное значение определяется при помои приведенного выше скрипта.

Если это 800 мегабайт (может быть и другой размер), прописываем:

$ sudo vi /etc/mysql/my.cnf

innodb_buffer_pool_size=800M

https://pq.hosting/help/myfiles/mysqlhasgoneavay-991x576.png

Существует и другой способ решения проблемы. Для этого увеличивают время ответа от сервера. Чтобы выполнить эту задачу, необходимо изменить параметр wait_timeout. Это время в секундах, на протяжении которого надо ждать ответа от сервера.

Например:

wait_timeout=500

параметр wait_timeout

Внося изменения, не забываем дальше перезагрузить сервер:

$ sudo systemctl restart mysql

или:

$ sudo systemctl restart mariadb

Слишком большой пакет

Когда клиент пользователя создает слишком большое количество пакетов, сервер выдаст именно эту ошибку. Доступный размер пакета (максимальное значение) можно увеличить с помощью параметра max_allowed_packet.

Например:

$ sudo vi /etc/mysql/my.cnf

max_allowed_packet=128M

Отдельно обратите внимание на клиент, ведь если он посылает много запросов, то вы явно что-то делает не так. Как минимум не стоит генерировать запросы к MySQL с помощью циклов for.

Сервер неверно проинициализирован

Если вы решите развернуть MySQL или MariaDB в Docker, то будьте готовы столкнуться с подобной ошибкой. Первоначальная инициализация контейнера требует чуть больше свободного времени. Если не дать контейнеру завершить инициализацию, сперва остановив его и запустив, то база данных будет всегда возвращать такую ошибку. Решение – нужно полностью удалить данные контейнера с базой данных.

Делается это так:

$ docker-compose down

или:

$ docker rm mysql-container

Дальше надо удалить хранилище (volume) с некорректно проинициализированной базой. Но в начале просмотрите список всех хранилищ:

$ docker volume ls

СЕРВЕР НЕВЕРНО ПРОИНИЦИАЛИЗИРОВАН

После удаляем:

$ docker volume rm имя_хранилища

Теперь можете запустить инициализацию приложения, только дождитесь, пока сервер баз данных сообщит, что он готов, и вы сможете к нему подключиться.

Приветвую!
Работали себе работали и на тебе =(

b_calendar_event_sect 50784 2 637 824
MySQL Query Error: CHECK TABLE `b_calendar_event_sect`[[2006] MySQL server has gone away]
DB query error.
Please try later.

SQL Query Error
[QUOTE]File: /home/bitrix/www/bitrix/modules/main/include/dbquery_error.php
Query: CHECK TABLE `b_calendar_event_sect`
[[2006] MySQL server has gone away]
debug_backtrace:
Array
(
[0] => Array
(
[file] => /home/bitrix/www/bitrix/modules/main/classes/mysql/database.php
[line] => 194
[class] =>
[function] => include
[args] => Array
(
[0] => /home/bitrix/www/bitrix/modules/main/include/dbquery_error.php
)

)

[1] => Array
(
[file] => /home/bitrix/www/bitrix/modules/main/admin/repair_db.php
[line] => 253
[class] => CDatabaseMysql
[function] => Query
[args] =>
)

[2] => Array
(
[file] => /home/bitrix/www/bitrix/admin/repair_db.php
[line] => 2
[class] =>
[function] => require_once
[args] => Array
(
[0] => /home/bitrix/www/bitrix/modules/main/admin/repair_db.php
)

)

)

Понравилась статья? Поделить с друзьями:
  • Ошибка 2006 wifire tv что это такое
  • Ошибка 2005 что делать если
  • Ошибка 2005 при установке world of tanks
  • Ошибка 2005 при прошивке flashtool как исправить
  • Ошибка 2005 при обновлении вот