Почему мои тупики не отображаются в SHOW ENGINE INNODB STATUS;?
У меня есть MariaDB (5.5.41
) кластер, состоящий из 2 узлов, настроенных как ведущий-ведомый. Все операции чтения и записи отправляются на один и тот же узел.
Я изучал некоторые тупиковые ситуации в течение нескольких недель.
Регулярно мое приложение PHP возвращается Message: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction.
Я имел обыкновение бегать SHOW ENGINE INNODB STATUS;
и увидит этот последний тупик, но по какой-то причине, после небольшого несоответствующего изменения конфигурации (изменение innodb_buffer_pool_instances
от 1 до 19) и перезагрузите оба узла, выполнив SHOW ENGINE INNODB STATUS;
не будет показывать тупик.
Однако, если я соединяюсь с моим клиентом mysql и вручную создаю транзакции, приводящие к взаимоблокировке, команда status показывает взаимоблокировку.
Я пытался играть innodb_print_all_deadlocks
Включить и выключить. Ничто не показывает в mysql-error.log
кроме моего вручную вызванного тупика.
Почему тупики, созданные моим PHP-приложением, больше не отображаются?
3 ответа
Я не думаю, что могу ответить на ваш вопрос напрямую, учитывая отсутствие доступа к вашим системам и предоставленную информацию. Тем не менее, вот некоторые инструменты AWESOME, которые я использовал, чтобы лучше справляться со всеми разновидностями баз данных на основе MySQL, которые мне поручено администрировать.
InnoTop: https://github.com/innotop/innotop
Проверьте команду "D" на странице справки innotop:
D: InnoDB Deadlocks
This mode shows the transactions involved in the last InnoDB
deadlock. A second table shows the locks each transaction held and
waited for. A deadlock is caused by a cycle in the waits-for
graph, so there should be two locks held and one waited for unless
the deadlock information is truncated. [...]
Команды "K" и "L" также могут иметь отношение к вам.
ПРИМЕЧАНИЕ: для полной полезности innotop может потребоваться изменить информацию и параметры схемы, а также добавить тестовую базу данных для сбора информации. ПРОЧИТАЙТЕ ВСЮ СТРАНИЦУ ЧЕЛОВЕКА, чтобы узнать, чем вы занимаетесь, прежде чем слепо менять свою базу данных. (Лично я люблю дополнительную информацию, которую обнародует innotop изменения...)
Менее непосредственно относится к вашей проблеме блокировки, но, тем не менее, очень полезно:
Набор инструментов Percona (ранее MAATKIT): https://www.percona.com/software/database-tools/percona-toolkit
Удачи!
Это довольно загадочно, что show engine innodb status
не дает вам необходимую тупиковую информацию. Однако вы можете проверить наличие тупиков, запустив mysqladmin debug
, который регистрирует все блокировки, а также блокировки LOCK TABLE, которые не отображаются show engine innodb status
в этом случае.
Эти проблемы иногда возникают в неподходящее время, и это тратит много времени. Я лично использую Monyog для мониторинга, который также делает это. Вы можете попробовать использовать его пробную версию, если ничего не работает.
Что делать в разделе [mysqld] my.cnf/ini
innodb_print_all_deadlocks=ON # for error log documentation & be proactive in correcting.
log_error=(a valid filename) # to write to RTM
innodb_buffer_pool_instances=8 # from 19 would be adequate RAM overhead