Spec-Zone.ru › MySQL 5.7

B.3.2.7 MySQL сервер разорвал соединение

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

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

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

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

Если у вас есть скрипт, вам просто нужно повторно выполнить запрос, чтобы клиент выполнил автоматическое переподключение. Это предполагает, что у вас включено автоматическое переподключение в клиенте (что является значением по умолчанию для командной строки 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, значение которой по умолчанию составляет 4 МБ. Вам также может потребоваться увеличить максимальный размер пакета на стороне клиента. Более подробная информация о настройке размера пакета приведена в Разделе 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. См. Раздел 5.4.2, «Журнал ошибок».

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

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

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

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

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

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

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

Spec-Zone.ru

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