"Ошибки" программистов: MySQL server has gone away на хостинге. Справочное руководство по MySQL Большой или некорректный пакет

SpoilerTarget">Спойлер

A.2.2 Ошибка MySQL server has gone away

Все изложенное в данном разделе относится также и к родственной ошибке Lost connection to server during query.
Наиболее часто ошибка MySQL server has gone away возникает в результате тайм-аута соединения и его закрытия сервером. По умолчанию сервер закрывает соединение по прошествии 8 часов бездействия. Можно изменить лимит времени, установив при запуске mysqld переменную wait_timeout.
Другой распространенной причиной получения ошибки MySQL server has gone away является выдача команды "закрытия" на соединении MySQL с последующей попыткой выполнить запрос на закрытом соединении.
Если это получено в скрипте, то достаточно просто повторить запрос от клиента, чтобы соединение автоматически восстановилось.
Обычно в этом случае выдаются следующие коды ошибки (какой из них вы получите, зависит от ОС
Код ошибки Описание
CR_SERVER_GONE_ERROR Клиент не может послать запрос серверу.
CR_SERVER_LOST Клиент не получил ошибки при передаче запроса серверу, но он не получил также полного ответа (или хоть какого-то ответа) на запрос.
Ошибка будет также выдана, если кто-нибудь уничтожит выполняющийся поток посредством kill номерпотока.
Проверить, что MySQL на ходу, можно, запустив mysqladmin version и изучив время работы (uptime). Если проблема в аварийном завершении mysqld, то необходимо сосредоточиться на поиске причины аварии. В этом случае следует сначала проверить, не будет ли уничтожен MySQL снова при повторном задании запроса (see section ).
Эти ошибки будут также выдаваться при посылке серверу неверного или слишком длинного запроса. Если mysqld получает неправильный или слишком большой пакет, то сервер предполагает, что с клиентом что-то не так, и закрывает соединение. Если необходимо выполнять объемные запросы (например, при работе с большими столбцами типа BLOB), можно увеличить предельный размер запроса, запустив mysqld с опцией -O max_allowed_packet=# (по умолчанию 1 Mб). Дополнительная память выделяется по требованию, так что mysqld будет использовать больше памяти только в случае, когда выдан большой запрос или когда mysqld должен возвратить большую строку результата!
Если у вас возникнет желание сделать отчет об ошибке по этой проблеме, то не забудьте включить в него следующие сведения:

  • Информацию о том, упал MySQL или нет (это можно определить по файлу hostname.err (see section A.4.1 Что делать, если работа MySQL сопровождается постоянными сбоями).
  • Если определенный запрос уничтожает mysqld, а используемые в нем таблицы перед выполнением запроса проверялись с помощью CHECK TABLE, то желательно составить контрольный тест (see section E.1.6 Создание контрольного примера при повреждении таблиц).
  • Значение переменной wait_timeout в сервере (это значение выдает mysqladmin variables).
  • Информацию о том, пробовали ли вы запускать mysqld с --log и проверять, появляется ли выданный запрос в журнале.

Эта статья может быть полезна тем, кто импортирует базы данных больших размеров на Denwer (либо на свой выделенный сервер). Допустим, размер Вашей базы 50 МБ . Просто через вставку запроса в phpMyAdmin в разделе "SQL " ничего не выйдет - браузер просто повиснет. Поэтому единственный выход - использовать импорт SQL-файла . Но тут Вас будет поджидать ошибка #2006 или server has gone away . Вот о решении этой проблемы я и расскажу в этой небольшой статье.

Самое первое, что Вы должны сделать - это настроить PHP для . Без этого по умолчанию Вы вообще не сможете загружать файлы размером, например, 50 МБ .

Дальше необходимо зайти в настройку MySQL (на Denwer это "usr\local\mysql-5.5\my.ini ") и там поменять значение параметра "max_allowed_packet " на, например, 100M , что соответствует 100 МБ :

Max_allowed_packet = 100M

После всего этого перезапустите MySQL (либо Denwer ), и больше ошибки 2006 или server has gone away возникать не будет. Если, конечно, Вы не захотите импортировать базу данных размером 150 МБ , тогда придётся снова увеличивать необходимые параметры в настройках PHP и MySQL .

Все изложенное в данном разделе относится также и к родственной ошибке Lost connection to server during query .

Наиболее часто ошибка MySQL server has gone away возникает в результате тайм-аута соединения и его закрытия сервером. По умолчанию сервер закрывает соединение по прошествии 8 часов бездействия. Можно изменить лимит времени, установив при запуске mysqld переменную wait_timeout .

Другой распространенной причиной получения ошибки MySQL server has gone away является выдача команды "закрытия" на соединении MySQL с последующей попыткой выполнить запрос на закрытом соединении.

Если это получено в скрипте, то достаточно просто повторить запрос от клиента, чтобы соединение автоматически восстановилось.

Обычно в этом случае выдаются следующие коды ошибки (какой из них вы получите, зависит от ОС):

Ошибка будет также выдана, если кто-нибудь уничтожит выполняющийся поток посредством kill номерпотока.

Проверить, что MySQL на ходу, можно, запустив mysqladmin version и изучив время работы (uptime). Если проблема в аварийном завершении mysqld , то необходимо сосредоточиться на поиске причины аварии. В этом случае следует сначала проверить, не будет ли уничтожен MySQL снова при повторном задании запроса (see section ).

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

Если у вас возникнет желание сделать отчет об ошибке по этой проблеме, то не забудьте включить в него следующие сведения:

  • Информацию о том, упал MySQL или нет (это можно определить по файлу hostname.err (see section A.4.1 Что делать, если работа MySQL сопровождается постоянными сбоями).
  • Если определенный запрос уничтожает mysqld , а используемые в нем таблицы перед выполнением запроса проверялись с помощью CHECK TABLE , то желательно составить контрольный тест (see section E.1.6 Создание контрольного примера при повреждении таблиц).
  • Значение переменной wait_timeout в сервере (это значение выдает mysqladmin variables).
  • Информацию о том, пробовали ли вы запускать mysqld с --log и проверять, появляется ли выданный запрос в журнале.

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

Таймаут соединения

Наиболее распространенная проблема: таймаут соединения, в результате чего сервер его закрывает. Решение весьма тривиальное — увеличение лимита времени wait_timeout в файле конфигурации my.cnf . Для этого в Debian нужно выполнить:

Sudo nano /etc/mysql/my.cnf

# Открытие файла настроек MySQL

Затем установить тайм-аут ожидания:

Wait_timeout = 600

# Время ожидания в секундах, можно установить вплоть до 28800 с (8 часов)

Не забудьте перезагрузить базу:

Sudo /etc/init.d/mysql restart

Иногда, при выполнении длительных запланированных задач, также может появиться ошибка MySQL Server Has Gone Away все из-за того же таймаута соединения. При этом лимит времени не получится существенно увеличить (максимум до нескольких часов), так как это может привести к заполнению буфера ожидающими соединениями.

Поэтому лучше проверить соединение и, при необходимости, переподключиться.

$link = mysql_connect("localhost","root","root"); # Здесь будут cron jobs if(!mysql_ping($link)) $link = mysql_connect("localhost","root","root", true);

# Подключение БД и переподключение при необходимости

Большой или некорректный пакет

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

Max_allowed_packet = 64M …

# Увеличение лимита размера входящего пакета, в МБ

Также не забудьте перезагрузить базу данных.

Самое главное

После того, как устраните ошибку MySQL Server Has Gone Away, поиграйтесь с параметрами wait_timeout и max_allowed_packet для получения оптимальных лимитов.


Все изложенное в данном разделе относится также и к родственной ошибке Lost connection to server during query .

Наиболее часто ошибка MySQL server has gone away возникает в результате тайм-аута соединения и его закрытия сервером. По умолчанию сервер закрывает соединение по прошествии 8 часов бездействия. Можно изменить лимит времени, установив при запуске mysqld переменную wait_timeout .

Другой распространенной причиной получения ошибки MySQL server has gone away является выдача команды "закрытия" на соединении MySQL с последующей попыткой выполнить запрос на закрытом соединении.

Если это получено в скрипте, то достаточно просто повторить запрос от клиента, чтобы соединение автоматически восстановилось.

Обычно в этом случае выдаются следующие коды ошибки (какой из них вы получите, зависит от ОС):

Ошибка будет также выдана, если кто-нибудь уничтожит выполняющийся поток посредством kill номерпотока.

Проверить, что MySQL на ходу, можно, запустив mysqladmin version и изучив время работы (uptime). Если проблема в аварийном завершении mysqld , то необходимо сосредоточиться на поиске причины аварии. В этом случае следует сначала проверить, не будет ли уничтожен MySQL снова при повторном задании запроса ().

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

Вы также можете получить разрыв соединения, если вы отправили пакет больше 16Mb, если ваш клиент старше чем 4.0.8, а ваш сервер 4.0.8 или новее.

Если у вас возникнет желание сделать отчет об ошибке по этой проблеме, то не забудьте включить в него следующие сведения:

    Информацию о том, упал MySQL или нет (это можно определить по файлу hostname.err ().

    Если определенный запрос уничтожает mysqld , а используемые в нем таблицы перед выполнением запроса проверялись с помощью CHECK TABLE , то желательно составить контрольный тест ().

    Значение переменной wait_timeout в сервере (это значение выдает mysqladmin variables).

    Информацию о том, пробовали ли вы запускать mysqld с --log и проверять, появляется ли выданный запрос в журнале.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: