У меня есть кластер MariaDB ( 5.5.41
), состоящий из 2 узлов, настроенных как главный-подчиненный. Все операции чтения и записи отправляются на один и тот же узел.
Я исследовал некоторые проблемы с тупиками в течение нескольких недель.
На регулярной основе мое приложение PHP возвращает Сообщение: SQLSTATE [40001]: сбой сериализации : 1213 Обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию.
Раньше я мог запускать SHOW ENGINE INNODB STATUS;
и видеть последний тупик, но по какой-то причине после небольшого несущественного изменения конфигурации (изменение innodb_buffer_pool_instances
с 1 по 19), и перезагрузка обоих узлов, выполнение SHOW ENGINE INNODB STATUS;
не будет показывать тупик.
Однако, если я подключаюсь к моему клиенту mysql и вручную создаю транзакции, приводящие к тупиковой ситуации, команда состояния показывает тупик.
Я пробовал играть innodb_print_all_deadlocks
ВКЛ и ВЫКЛ. В журнале mysql-error.log
ничего не отображается, за исключением тупика, вызванного вручную.
Почему тупиковые ситуации, созданные моим приложением PHP, больше не отображаются?
Довольно странно, что show engine innodb status
не дает вам необходимой информации о взаимоблокировках. Однако вы можете проверить наличие взаимоблокировок, запустив mysqladmin debug
, который регистрирует все блокировки, а также блокировки LOCK TABLE, которые не отображаются в show engine innodb status
в этом случае.
Эти проблемы иногда возникают не в то время, и на это тратится много времени. Я лично использую Monyog для мониторинга, который также делает то же самое. Если ничего не работает, попробуйте воспользоваться пробной версией.
Я не думаю, что смогу ответить на ваш вопрос напрямую, учитывая отсутствие у меня доступа к вашим системам и предоставленной информации. Однако вот несколько УДИВИТЕЛЬНЫХ инструментов, которые я использовал, чтобы лучше справиться со всеми разновидностями баз данных, производных от 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 ...)
Менее актуальна для вашей проблемы с блокировкой, но, тем не менее, очень полезна:
The Percona Toolkit (ранее MAATKIT): https://www.percona.com/software/database-tools/percona-toolkit
Удачи!
Чем заняться в [ 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