Подтвердить что ты не робот

Как обнаружить тупики в Mysql/innodb?

Я знаю, что взаимоблокировки неизбежно возникают при использовании транзакций в Innodb и что они безвредны, если они правильно обрабатываются кодом приложения - "просто попробуйте еще раз", как говорится в руководстве.

Итак, мне было интересно - как вы обнаруживаете тупики? Заблокирован ли какой-то специальный номер ошибки mysql? Я использую расширение PHP mysqli, если это имеет значение.

Спасибо.

Изменить: найдено решение, см. комментарии

4b9b3361

Ответ 2

"SHOW ENGINE INNODB STATUS" из клиента командной строки MySQL (а не браузера запросов) предоставит вам информацию о тупиках.

Тупики также могут быть вызваны незафиксированными транзакциями (как правило, программными ошибками), и лицо, выполняющее незавершенную транзакцию, не увидит проблему, поскольку они будут работать нормально (через их данные не будут зафиксированы).

Ответ 3

Попробуйте MaatKit. Он имеет регистратор ошибок.

Ответ 4

Попробуйте использовать MONYOG. Включите опцию MONYOG "Контроль взаимоблокировки" для отслеживания тупиков, о которых сообщает INNODB STATUS. MONYOG отправит предупреждение пользователю, когда произойдет новый тупик. enter image description here

Ответ 5

Попробуйте innotop, обнаружит тупик для вас.

Ответ 6

Если вы находитесь на mac:

$brew установить percona-toolkit

$pt-deadlock-logger -uroot -ask-pass localhost

Ответ 7

Недавно я создал очень простую проверку на наличие взаимоблокировок для реализации дымового теста веб-приложения. Код можно много улучшить, но пока он работает. См. Https://dev.mysql.com/doc/refman/8.0/en/innodb-standard-monitor.html для получения дополнительной информации о выводе используемого запроса ниже.

$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;

if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
  trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}

if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
  trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}