Intereting Posts
Функции повторного использования Symfony2 в контроллерах PHP file_exists или is_file не отвечает правильно в течение 10-20 с на NFS-файлах (EC2) Обновление до PHP 5.3 с отключенными функциями предупреждения Поменяйте все URL-адреса youtube, чтобы вставлять их через preg_replace () buddypress bp_core_add_message () не запускает почему? Использование swiftmailer и отправка вложений Force-Download с php на Amazon S3 PHP: Как установить текущий рабочий каталог таким же, как каталог, выполняющий скрипт Многопользовательский поисковый запрос PHP MySQL с использованием опции / выбора тегов HTML-формы mysqli + xdebug точка останова после закрытия оператора приводит к многочисленным предупреждениям preg_replace_callback () – Откат внутри экземпляра текущего объекта 0x80040400: QuickBooks обнаружил ошибку при анализе предоставленного текстового потока XML Кросс-компиляция PHP Отменить ожидающие запросы AJAX в приложении PHP? Файл sugarcrmDownload после обновления

Внезапная ошибка «сервер MySQL ушла» на сайте PHP

Сегодня один из моих веб-сайтов начал показывать

  Номер ошибки: 2006
 Сервер MySQL ушел 

Это клиентский сайт с низким трафиком, работающий под Apache 2.2.9 (Debian), PHP 5.2.6-1 + lenny3 (с использованием Framework CodeIgniter 1.7.1) и MySQL 5.0.51a. Я, очевидно, выяснил об ошибке, но все возможные решения подразумевают, что есть большие запросы, которые могут закончиться, и сбросить соединение, или поразить ограничения пакетов. Однако это не так, это небольшая база данных, обработанная простейшими запросами. Чтобы быть уверенным в этом, я составил несколько запросов, чтобы вернуть одну строку, все еще ту же ошибку.

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

Я пытался:

  • Перезапуск MySQL
  • Перезапуск всего сервера
  • Поиск ошибок в журналах (как Apache, так и MySQL, нет)
  • Проверка прав пользователя db
  • Изменение mysql.connect_timeout и default_socket_timeout в PHP
  • Изменение max_allowed_packet в MySQL
  • Чтение официальных документов , форума и всего в SO, в котором говорится, что «сервер MySQL ушел»,

Новое:

  • Отключение постоянных подключений в PHP
  • Изменение wait_timeout и connect_timeout в MySQL

Обновить:

Похоже, что это связано с временем выполнения моего сценария: он извлекает некоторую информацию с помощью PHP-клиента Facebook, и этот вызов, похоже, случайно не работает сегодня, поэтому у меня нет данных из Facebook или ошибки MySQL. Но, к моему удивлению, ни одно из данных решений, похоже, не связано с таймаутом.

Есть идеи? Спасибо за ваше время!

Как я уже сказал в своем обновлении, я пришел к выводу, что проблема с MySQL возникает, когда ссылка на Facebook занимает больше времени, чем максимальное время соединения с БД. Ни одно из предложений не могло превзойти это ограничение, поэтому я решил обойти его и снова подключиться каждый раз, когда я предположил, что ссылка, возможно, ушла.

Поэтому после каждого звонка в Facebook я использовал следующий код:

  $ This-> load-> базы данных ();
 $ This-> db-> переподключение (); 

Это особое решение при использовании CodeIgniter, а функция AFAIK db-> reconnect () доступна только с версии 1.7.2, поэтому я обновил ее для работы.

Спасибо всем за ваши ответы!

Вероятно, это время соединения, влияющее на ваши постоянные соединения в PHP. Я видел их все время. Параметр тайм-аута находится внутри самой MySQL.

Ваши варианты включают: – не использование постоянных соединений – отключение тайм-аута ожидания на сервере MySQL – улавливание ошибки

Я всегда завершаю пересоединение в свой собственный класс PDO, поэтому я даже не могу вспомнить, если PHP повторно подключается или нет. В любом случае, это простое решение. По запросу уловить и снова подключиться.

Я «сгенерировал» эту ошибку в прошлом с помощью InnoDB. Если вы используете этот движок, каков результат работы SHOW ENGINE INNODB STATUS после сбоя?

Поскольку другие сайты работают, мы можем предположить, что это связано с вашим сайтом (а не с сервером). В официальных документах упоминается, что это может произойти, если вы попытаетесь выполнить запросы после закрытия подключения к серверу. Есть ли у вас крючки в CodeIgniter, которые делают что-то в конце запроса, когда соединение с базой данных может быть закрыто?

Вы отмечаете, что это задача на ночь, и вы получаете данные FaceBook и т. Д. Происходит ли процесс в течение длительного времени?

У меня недавно был сценарий, который перемещает данные из одного кластера в другой и преобразует форматы и т. Д. Этот сценарий работает 24/7, перемещая эти данные. Я обнаружил, что с постоянными соединениями или без них библиотеки MySQL все равно выпадают через несколько минут (иногда 5 минут, а иногда и дольше).

Единственный способ, которым я нашел, чтобы обойти это для моего дела, – это установить проверку времени в моей обертке и проверить, сколько времени прошло с момента последнего подключения к предыдущему запросу перед выполнением запроса. Я установил его, чтобы проверить, было ли это больше 2 минут, и если да, чтобы восстановить соединение, для установки флажка «new_link» (4-й параметр) в mysql_connect устанавливается значение false.

С тех пор, как это изменилось, у меня никогда не было такой же ошибки.