Zobacz kilka ostatnich zakleszczeń innodb

12

Widzę, że mogę wyświetlić najnowszą impas w mysql / innodb, ale czy istnieje sposób, aby wyświetlić wcześniejsze impasy? Mamy dwa problemy z impasem, z których jeden jest ważny, a drugi nie. Mniej ważny impas zdarza się kilka razy dziennie, więc staje się „najnowszym” impasem.

gwgeller
źródło

Odpowiedzi:

15

Istnieje ustawienie wprowadzone w MySQL 5.5.30: innodb_print_all_deadlocks

Gdy ta opcja jest włączona, informacje o wszystkich zakleszczeniach w transakcjach użytkownika InnoDB są zapisywane w dzienniku błędów mysqld. W przeciwnym razie zobaczysz informacje tylko o ostatnim impasie za pomocą polecenia SHOW ENGINE INNODB STATUS. Sporadyczny impas InnoDB niekoniecznie stanowi problem, ponieważ InnoDB natychmiast wykrywa ten warunek i automatycznie wycofuje jedną z transakcji. Możesz użyć tej opcji, aby rozwiązać problemy z zakleszczeniami, jeśli aplikacja nie ma odpowiedniej logiki obsługi błędów w celu wykrycia wycofania i ponowienia próby działania. Duża liczba zakleszczeń może wskazywać na potrzebę restrukturyzacji transakcji, które wydają instrukcje DML lub SELECT ... FOR UPDATE dla wielu tabel, tak aby każda transakcja uzyskiwała dostęp do tabel w tej samej kolejności, unikając w ten sposób stanu zakleszczenia.

Po prostu dodaj to ustawienie do my.cnf

[mysqld]
innodb_print_all_deadlocks = 1

lub

[mysqld]
innodb_print_all_deadlocks = on

Nie musisz restartować mysql. Zaloguj się do mysql i uruchom

mysql> SET GLOBAL innodb_print_all_deadlocks = 1;

or

mysql> SET GLOBAL innodb_print_all_deadlocks = 'ON';

To ustawienie też jest dla mnie nowe.

Spróbuj i powiedz nam wszystko, co myślisz !!!

RolandoMySQLDBA
źródło
Działamy w wersji 5.5.34. Czy są jakieś opcje dla naszej wersji?
gwgeller
Mój błąd. Jest w wersji 5.5 dev.mysql.com/doc/refman/5.5/en/… . Zaktualizuję moją odpowiedź.
RolandoMySQLDBA
Działa jak w reklamie, dzięki! Zmieniłem ustawienie za pomocą sql, więc nie musiałem restartować. Przypadkowo wystąpiło kilka mniej poważnych zakleszczeń, które pojawiły się w dzienniku błędów.
gwgeller
Ustawienie wartości w czasie wykonywania nie działa dla mnie, nie zapisuje nic w dzienniku błędów.
lapo,
1
@Jordan AWS nigdy nie rozdaje SUPER i wspominałem o tym 6 lat temu: dba.stackexchange.com/questions/34525/… . Używają wyzwalaczy, aby upewnić się, że nie możesz włamać się mysql.useri uruchomić FLUSH PRIVILEGES;.
RolandoMySQLDBA