Посмотреть последние несколько тупиков innodb

12

Я вижу, что могу просмотреть последний тупик в mysql / innodb, но есть ли способ просмотреть прошлые тупики? У нас есть две тупиковые проблемы, одна из которых важна, а другая нет. Менее важный тупик происходит несколько раз в день, поэтому он становится «последним» тупиком.

gwgeller
источник

Ответы:

15

Существует настройка, которая была введена в MySQL 5.5.30: innodb_print_all_deadlocks

Когда эта опция включена, информация обо всех взаимоблокировках в пользовательских транзакциях InnoDB записывается в журнал ошибок mysqld. В противном случае вы видите информацию только о последней тупиковой ситуации, используя команду SHOW ENGINE INNODB STATUS. Случайный тупик InnoDB не обязательно является проблемой, потому что InnoDB немедленно обнаруживает условие и автоматически откатывает одну из транзакций. Вы можете использовать эту опцию, чтобы выяснить причину возникновения взаимоблокировок, если у приложения нет соответствующей логики обработки ошибок, чтобы обнаружить откат и повторить его работу. Большое количество взаимоблокировок может указывать на необходимость реструктуризации транзакций, которые выдают операторы DML или SELECT ... FOR UPDATE для нескольких таблиц, чтобы каждая транзакция обращалась к таблицам в одном и том же порядке, избегая, таким образом, условия взаимоблокировки.

Просто добавьте этот параметр в my.cnf

[mysqld]
innodb_print_all_deadlocks = 1

или

[mysqld]
innodb_print_all_deadlocks = on

Вам не нужно перезапускать MySQL. Просто войдите в MySQL и запустите

mysql> SET GLOBAL innodb_print_all_deadlocks = 1;

or

mysql> SET GLOBAL innodb_print_all_deadlocks = 'ON';

Этот параметр также является новым для меня.

Попробуйте и расскажет нам все, что вы думаете !!!

RolandoMySQLDBA
источник
Мы работаем 5.5.34. Есть ли варианты для нашей версии?
gwgeller
Виноват. Это в 5.5 dev.mysql.com/doc/refman/5.5/en/… . Я обновлю свой ответ.
RolandoMySQLDBA
Работает как рекламируется, спасибо! Я изменил настройку с помощью sql, поэтому мне не пришлось перезапускать. По совпадению пара менее серьезных взаимоблокировок произошла и обнаружилась в журнале ошибок.
gwgeller
Установка значения во время выполнения не работает для меня, он ничего не записывает в журнал ошибок.
Lapo
1
@Jordan AWS никогда не выдаёт SUPER, и я упоминал об этом 6 лет назад: dba.stackexchange.com/questions/34525/… . Они используют триггеры, чтобы убедиться, что вы не можете взломать mysql.userи запустить FLUSH PRIVILEGES;.
RolandoMySQLDBA