Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел также покрывает связанное Lost connection to server during query
ошибка.
Наиболее распространенная причина MySQL server has gone away
ошибка состоит в том,
что сервер, синхронизированный и, закрыл соединение. В этом случае Вы обычно получаете один из следующих кодов
ошибки (какой, который Вы получаете, работает системно-зависимый).
Код ошибки | Описание |
---|---|
CR_SERVER_GONE_ERROR |
Клиент не мог отправить вопрос серверу. |
CR_SERVER_LOST
|
Клиент не получал ошибку при записи в сервер, но это didn'tget полный ответ (или любой ответ) к вопросу. |
По умолчанию сервер закрывает соединение после восьми часов, если ничто не произошло. Можно изменить ограничение
по времени, устанавливая wait_timeout
переменная, когда Вы запускаете mysqld. См. Раздел
5.1.4, "Системные Переменные Сервера".
Если у Вас есть сценарий, только необходимо выпустить запрос снова для клиента, чтобы сделать автоматическое
пересоединение. Это предполагает, что у Вас есть автоматическое пересоединение во включенном клиенте (который
является значением по умолчанию для mysql
клиент командной строки).
Некоторые другие общие причины MySQL server has gone away
ошибка:
Вы (или администратор дб) уничтожили рабочий поток с a KILL
оператор или mysqladmin уничтожают команду.
Вы попытались выполнить запрос после закрытия соединения с сервером. Это указывает на логическую ошибку в приложении, которое должно быть исправлено.
У клиентского приложения, работающего на различном узле, нет необходимых полномочий соединиться с сервером MySQL от того узла.
Вы получили тайм-аут от соединения TCP/IP на стороне клиента. Это может произойти,
если Вы использовали команды: mysql_options(...,
MYSQL_OPT_READ_TIMEOUT,...)
или mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)
. В этом случае
увеличение тайм-аута может помочь решить проблему.
Вы встретились с тайм-аутом на стороне сервера, и автоматическое пересоединение в
клиенте отключается ( reconnect
флаг в MYSQL
структура равна 0).
Вы используете клиент Windows, и сервер отбросил соединение (вероятно, потому что
wait_timeout
истекший) прежде, чем команда была дана.
Проблема на Windows состоит в том, что в некоторых случаях MySQL не получает ошибку от ОС при записи в соединение TCP/IP с сервером, но вместо этого получает ошибку, пытаясь считать ответ из соединения.
Решение этого состоит в том, чтобы или сделать a mysql_ping()
на соединении, если было длительное время начиная с
последнего запроса (это - то, что Соединитель/ODBC делает), или набор wait_timeout
на mysqld сервере, настолько высоком, что это
практически никогда времена.
Можно также получить эти ошибки, если Вы отправляете запрос серверу, который
является неправильным или слишком большим. Если mysqld получает пакет, который является слишком
большим или не в порядке, он предполагает, что что-то пошло не так, как надо с клиентом и закрывает
соединение. Если Вы нуждаетесь в больших запросах (например, если Вы работаете с большим BLOB
столбцы), можно увеличить предел запроса, устанавливая сервер max_allowed_packet
переменная, у которой есть значение по умолчанию 1 МБ. Вы, возможно, также должны увеличить максимальный
пакетный размер на клиентском конце. Больше информации об установке пакетного размера дается в Разделе
C.5.2.10, "Пакет, Слишком Большой".
INSERT
или REPLACE
оператор, который вставляет очень много строк, может
также вызвать эти виды ошибок. Любой из этих операторов отправляет единственный запрос серверу
независимо от числа строк, которые будут вставлены; таким образом можно часто избегать ошибки,
сокращая количество строк, отправленных на INSERT
или REPLACE
.
Вы также получаете потерянное соединение, если Вы отправляете пакету 16 МБ или больше, если Ваш клиент старше чем 4.0.8, и Ваш сервер 4.0.8 и выше, или наоборот.
Также возможно видеть эту ошибку, если поиски имени хоста перестали работать (например, если сервер DNS, на который полагаются Ваш сервер или сеть, теряет работоспособность). Это - то, потому что MySQL зависит от хост-системы для разрешения имени, но не имеет никакого способа знать, работает ли это — с точки зрения MySQL, проблема неотличима от любого другого сетевого тайм-аута.
Можно также видеть MySQL server has gone away
ошибка, если MySQL
запускается с --skip-networking
опция.
Другая сетевая проблема, которая может вызвать эту ошибку, происходит, если порт MySQL (значение по умолчанию 3306) блокируется Вашим брандмауэром, таким образом предотвращая какие-либо соединения вообще с сервером MySQL.
Можно также встретиться с этой ошибкой с приложениями, что дочерние процессы ветвления, все из которых пытаются использовать то же самое соединение с сервером MySQL. Этого можно избежать при использовании отдельного соединения для каждого дочернего процесса.
Вы встретились с ошибкой, где сервер умер, выполняя запрос.
Можно проверить, умер ли сервер MySQL и перезапустил, выполняясь mysqladmin версия и исследуя время работы сервера. Если клиентское соединение было повреждено, потому что mysqld, разрушенный и перезапущенный, следует сконцентрироваться на обнаружении причины катастрофического отказа. Запустите, проверяя, уничтожает ли издание запроса снова сервер снова. См. Раздел C.5.4.2, "Что к MySQL Do If Продолжает Отказывать".
Можно получить больше информации о потерянных соединениях, запускаясь mysqld с --log-warnings=2
опция. Это регистрирует некоторые из разъединенных ошибок в hostname.err
файл. См. Раздел 5.2.2, "Журнал
ошибок".
Если Вы хотите создать отчет об ошибках относительно этой проблемы, убедитесь, что Вы включаете следующую информацию:
Укажите, умер ли сервер MySQL. Можно найти информацию об этом в журнале ошибок сервера. См. Раздел C.5.4.2, "Что к MySQL Do If Продолжает Отказывать".
Если определенный запрос уничтожает mysqld, и с включенными таблицами сверились CHECK TABLE
прежде, чем Вы выполняли запрос, можно обеспечить
восстанавливаемый прецедент? См.
Что является значением wait_timeout
системная переменная в сервере MySQL? (mysqladmin переменные дает Вам значение этой
переменной.)
Вы попытались выполнить mysqld с общим журналом запросов, позволенным определить, появляется ли проблемный запрос в журнале? (См. Раздел 5.2.3, "Общий Журнал запросов".)
См. также Раздел C.5.2.11, "Коммуникационные Ошибки и Прерванные Соединения", и Раздел 1.7, "Как Сообщить об Ошибках или проблемах".