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.