Sehen Sie sich die letzten Innodb-Deadlocks an

12

Ich sehe, dass ich den neuesten Deadlock in mysql / innodb anzeigen kann, aber gibt es eine Möglichkeit, vergangene Deadlocks anzuzeigen? Wir haben zwei Deadlock-Probleme, eines ist wichtig und das andere nicht. Der weniger wichtige Deadlock tritt mehrmals am Tag auf, sodass er zum "neuesten" Deadlock wird.

Gwgeller
quelle

Antworten:

15

In MySQL 5.5.30 wurde eine Einstellung eingeführt: innodb_print_all_deadlocks

Wenn diese Option aktiviert ist, werden Informationen zu allen Deadlocks in InnoDB-Benutzertransaktionen im mysqld-Fehlerprotokoll aufgezeichnet. Andernfalls werden mit dem Befehl SHOW ENGINE INNODB STATUS nur Informationen zum letzten Deadlock angezeigt. Ein gelegentlicher InnoDB-Deadlock ist nicht unbedingt ein Problem, da InnoDB den Zustand sofort erkennt und eine der Transaktionen automatisch zurücksetzt. Mit dieser Option können Sie möglicherweise Fehler beheben, warum Deadlocks auftreten, wenn eine Anwendung nicht über die entsprechende Fehlerbehandlungslogik verfügt, um das Rollback zu erkennen und den Vorgang erneut zu versuchen. Eine große Anzahl von Deadlocks weist möglicherweise auf die Notwendigkeit hin, Transaktionen, die DML- oder SELECT ... FOR UPDATE-Anweisungen für mehrere Tabellen ausgeben, neu zu strukturieren, sodass jede Transaktion in derselben Reihenfolge auf die Tabellen zugreift, wodurch die Deadlock-Bedingung vermieden wird.

Fügen Sie einfach diese Einstellung hinzu my.cnf

[mysqld]
innodb_print_all_deadlocks = 1

oder

[mysqld]
innodb_print_all_deadlocks = on

Sie müssen MySQL nicht neu starten. Melden Sie sich einfach bei MySQL an und führen Sie es aus

mysql> SET GLOBAL innodb_print_all_deadlocks = 1;

or

mysql> SET GLOBAL innodb_print_all_deadlocks = 'ON';

Diese Einstellung ist auch für mich neu.

Probieren Sie es aus und sagen Sie uns alles, was Sie denken !!!

RolandoMySQLDBA
quelle
Wir führen 5.5.34 aus. Gibt es Optionen für unsere Version?
Gwgeller
Mein Fehler. Es ist in 5.5 dev.mysql.com/doc/refman/5.5/en/… . Ich werde meine Antwort aktualisieren.
RolandoMySQLDBA
Funktioniert wie angekündigt, danke! Ich habe die Einstellung mit SQL geändert, damit ich nicht neu starten musste. Zufälligerweise traten einige der weniger schwerwiegenden Deadlocks auf und wurden im Fehlerprotokoll angezeigt.
Gwgeller
Das Festlegen des Werts zur Laufzeit funktioniert bei mir nicht, es wird nichts in das Fehlerprotokoll geschrieben.
Lapo
1
@ Jordan AWS gibt niemals SUPER heraus und ich habe dies vor 6 Jahren erwähnt: dba.stackexchange.com/questions/34525/… . Sie verwenden Trigger, um sicherzustellen, dass Sie nicht hacken mysql.userund ausführen können FLUSH PRIVILEGES;.
RolandoMySQLDBA