Сегодня один из моих веб-сайтов начал показывать
Номер ошибки: 2006 Сервер MySQL ушел
Это клиентский сайт с низким трафиком, работающий под Apache 2.2.9 (Debian), PHP 5.2.6-1 + lenny3 (с использованием Framework CodeIgniter 1.7.1) и MySQL 5.0.51a. Я, очевидно, выяснил об ошибке, но все возможные решения подразумевают, что есть большие запросы, которые могут закончиться, и сбросить соединение, или поразить ограничения пакетов. Однако это не так, это небольшая база данных, обработанная простейшими запросами. Чтобы быть уверенным в этом, я составил несколько запросов, чтобы вернуть одну строку, все еще ту же ошибку.
Учетные данные базы данных в порядке, я даже могу войти непосредственно в mysql, запустить некоторые запросы сайта и мгновенно получить нужные данные. Есть несколько других сайтов на одном сервере и подключения к базе данных, гораздо более крупные сайты, и все они не имеют проблем.
Я пытался:
mysql.connect_timeout
и default_socket_timeout
в PHP max_allowed_packet
в MySQL Новое:
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.
С тех пор, как это изменилось, у меня никогда не было такой же ошибки.