Spec-Zone.ru › MySQL 9.2

B.3.2.7 Сервер MySQL отключился

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

Наиболее распространённая причина ошибки MySQL server has gone away заключается в том, что сервер превысил время ожидания и закрыл соединение. В этом случае вы обычно получаете один из следующих кодов ошибок (который вы получите, зависит от операционной системы).

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

По умолчанию сервер закрывает соединение через восемь часов, если ничего не происходит. Вы можете изменить это ограничение времени, установив переменную wait_timeout при запуске mysqld. См. Раздел 7.1.8, «Переменные сервера».

Если у вас есть скрипт, вам просто нужно повторно выполнить запрос, чтобы клиент выполнил автоматическое переподключение. Предполагается, что у вас включена автоматическая переподключение в клиенте (что является значением по умолчанию для mysql командной строки клиента).

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

  • Вы (или администратор базы данных) прервали запущенную нить с помощью оператора KILL или команды mysqladmin kill.

  • Вы попытались выполнить запрос после закрытия соединения с сервером. Это указывает на логическую ошибку в приложении, которую необходимо исправить.

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

  • Вы получили таймаут от TCP/IP-соединения на стороне клиента. Это может произойти, если вы использовали команды: или . В этом случае увеличение таймаута может помочь решить проблему.

  • Вы столкнулись с таймаутом на стороне сервера, а автоматическое переподключение в клиенте отключено (флаг reconnect в структуре MYSQL равен 0).

  • Вы используете клиент Windows, а сервер прервал соединение (вероятно, потому что wait_timeout истек) до отправки команды.

    Проблема в Windows заключается в том, что в некоторых случаях MySQL не получает ошибку от ОС при записи в TCP/IP-соединение с сервером, а вместо этого получает ошибку при попытке чтения ответа из соединения.

    Решение заключается в выполнении на подключении, если прошло много времени с момента последнего запроса (так поступает Connector/ODBC), или установить wait_timeout на сервере mysqld так высоко, что он фактически никогда не превысит время ожидания.

  • Вы также можете получить эти ошибки, если отправили на сервер некорректный или слишком большой запрос. Если mysqld получает пакет, который слишком велик или неправильно расположен, он предполагает, что с клиентом возникла проблема, и закрывает соединение. Если вам нужны большие запросы (например, если вы работаете с большими BLOB столбцами), вы можете увеличить лимит запросов, установив переменную сервера max_allowed_packet, значение которой по умолчанию составляет 64 МБ. Возможно, вам также потребуется увеличить максимальный размер пакета на стороне клиента. Более подробная информация о настройке размера пакета приведена в разделе B.3.2.8, «Пакет слишком велик».

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

  • Возможны также эти ошибки, если поиск по имени хоста завершится неудачно (например, если DNS-сервер, на котором полагается ваш сервер или сеть, вышел из строя). Это происходит потому, что MySQL зависит от системы хоста для разрешения имен, но не имеет возможности узнать, работает ли это—с точки зрения MySQL проблема неотличима от любой другой сетевой задержки.

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

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

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

  • Вы столкнулись с ошибкой, когда сервер завис при выполнении запроса.

Вы можете проверить, не завис ли сервер MySQL и не перезапустился ли он, выполнив mysqladmin version и изучив время работы сервера. Если подключение клиента было прервано из-за того, что mysqld упал и перезапустился, вам следует сосредоточиться на поиске причины сбоя. Начните с проверки того, не убивает ли повторное выполнение запроса сервер снова. См. Раздел B.3.3.3, «Что делать, если MySQL продолжает падать».

Чтобы получить больше информации о потерянных соединениях, запустите mysqld с установленной системной переменной log_error_verbosity в 3. Это записывает некоторые сообщения о разъединении в файл hostname.err. См. Раздел 7.4.2, «Журнал ошибок».

Если вы хотите создать отчёт об ошибке, обязательно включите следующую информацию:

  • Укажите, завис ли сервер MySQL. Вы можете найти информацию об этом в журнале ошибок сервера. См. Раздел B.3.3.3, «Что делать, если MySQL продолжает падать».

  • Если определённый запрос убивает mysqld и проверка соответствующих таблиц с помощью CHECK TABLE была выполнена до запуска запроса, предоставьте воспроизводимый тестовый случай. См. Раздел 7.9, «Отладка MySQL».

  • Какое значение имеет системная переменная wait_timeout на сервере MySQL? (mysqladmin variables даёт вам это значение.)

  • Вы пытались запустить mysqld с включённым общим журналом запросов, чтобы определить, появляется ли проблемный запрос в журнале? (См. Раздел 7.4.3, «Журнал общих запросов».)

См. также Раздел B.3.2.9, «Ошибки связи и прерванные соединения» и Раздел 1.6, «Как сообщать об ошибках или проблемах».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/gone-away.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API