Как определить, были ли какие-либо MySQL-соединения сброшены или истекло время ожидания? - PullRequest
2 голосов
/ 27 февраля 2011

Клиент использует PHP для подключения к MySQL.Сценарии PHP и база данных MySQL расположены на 2 разных серверах Linux.Он пожаловался на то, что соединения с базой данных были разорваны или истек тайм-аут, и попросил меня посмотреть.

Есть ли место в MySQL, которое может показать мне, что и сколько соединений было разорвано или истекло время ожидания?Я заглянул в медленный журнал запросов и ничего не увидел.

Есть ли какие-либо предложения по диагностике этой проблемы с подключением к базе данных с пропущенным / истекшим временем ожидания?

Спасибо

Ответы [ 2 ]

5 голосов
/ 27 февраля 2011

Вы, конечно, можете контролировать

Aborted_clients

Переменная состояния (т. Е. С ПОКАЗАТЬ ГЛОБАЛЬНОЕ СОСТОЯНИЕ) и увидеть тайм-ауты соединения.

Однако лучшее место для обнаружения этого - на стороне клиента. Предполагая, что у вас есть правильная обработка ошибок и ведение журнала на стороне клиента, вы, как правило, увидите известную ошибку «Сервер ушел».

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


Распространенной причиной этого является злоупотребление постоянными соединениями с сервера предварительной проверки Apache. Поскольку серверы предварительной обработки Apache обычно долго поддерживают процессы без работы, но постоянные соединения могут оставаться открытыми для каждого процесса, соединения могут слишком долго простаивать, создавая «утреннюю ошибку».

Исправить это просто - просто отключите постоянные соединения. Это неуместная пессимизация почти во всех случаях.

3 голосов
/ 27 февраля 2011

Что касается журналов сервера, вы можете посетить http://dev.mysql.com/doc/refman/5.0/en/server-logs.html для получения дополнительной информации

В PHP:

  • Ссылка - это ресурс, который можно передать в [ mysql_ping ], это вернет true / false в зависимости от состояния сети.

Например:

if(mysql_ping($link))
{
    //Still Connected.
}
...