最後のいくつかのinnodbデッドロックを表示する


12

mysql / innodbで最新のデッドロックを表示できることがわかりましたが、過去のデッドロックを表示する方法はありますか?デッドロックには2つの問題があります。1つは重要で、もう1つは重要ではありません。重要性の低いデッドロックは1日に数回発生するため、「最新の」デッドロックになります。

回答:


15

MySQL 5.5.30で導入された設定があります:innodb_print_all_deadlocks

このオプションを有効にすると、InnoDBユーザートランザクションのすべてのデッドロックに関する情報がmysqldエラーログに記録されます。それ以外の場合は、SHOW ENGINE INNODB STATUSコマンドを使用して、最後のデッドロックに関する情報のみを表示します。InnoDBは状態を即座に検出し、トランザクションの1つを自動的にロールバックするため、偶発的な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';

この設定は私にとっても初めてです。

それを試してみて、あなたの考えを私たちにすべて教えてください!!!


5.5.34を実行しています。私たちのバージョンにはオプションがありますか?
gwgeller 2014

私の間違い。これは、5.5であるdev.mysql.com/doc/refman/5.5/en/...。回答を更新します。
RolandoMySQLDBA 2014

広告どおりに機能します。ありがとうございます。sqlを使用して設定を変更したので、再起動する必要はありませんでした。偶然にも、それほど深刻ではないデッドロックがいくつか発生し、エラーログに表示されました。
gwgeller、2015年

実行時に値を設定しても機能しません。エラーログには何も書き込まれません。
lapo

1
@Jordan AWSがSUPERを提供することは決してなく、6年前にこれについて言及しました:dba.stackexchange.com/questions/34525/…。トリガーを使用して、ハッキングmysql.userして実行できないようにしますFLUSH PRIVILEGES;
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.