製品

Percona

pt-deadlock-logger

コマンド

pt-deadlock-logger [ オプション ] [ DSN ]

【必須項目】

  • ・[ オプション ] : -p パスワード

【主なオプション】

  • ・ –dest D=データベース名, t=テーブル名 : デットロック情報を保存するテーブルを指定します
  • ・ –create-dest-table : 上記のオプションで指定したテーブルが存在しない場合、新規作成します

目的

データベースのデッドロック情報をダンプします

設定ファイル

上記の必須項目を、設定ファイルにまとめておきます

# touch /etc/percona-toolkit/pt-deadlock-logger.conf
# vi /etc/percona-toolkit/pt-deadlock-logger.conf

・設定ファイルの作成

# touch /etc/percona-toolkit/pt-deadlock-logger.conf

・設定ファイルの編集

# vi /etc/percona-toolkit/pt-deadlock-logger.conf

# config for pt-deadlock-logger
password =

・MySQL のパスワードを記入

password =

シナリオ

デッドロック情報を保存するテーブルを作成するため、初回は保存用テーブル作成オプションをつけて実行します

(初回)

# pt-deadlock-logger --create-dest-table --dest D=test, t=deadlocks

(2回目以降)

# pt-deadlock-logger --dest D=test, t=deadlocks

MySQL内でデッドロックを発生させると、作成したテーブルに情報が書き込まれます
コンソールを2つ起動し、MySQLへログインします

deadlock-logger

→ これでデッドロックが発生するので、下記コマンドを実行して書き込まれた情報を確認します

mysql> SELECT * FROM deadlocks\G

結果

以下のように、エラー情報がdeadlocksテーブルに格納されていることが確認できます

mysql> SELECT * FROM test.deadlocks\G
*************************** 1. row ***************************
   server: localhost.localdomai
       ts: 2017-04-04 00:45:44
   thread: 21
   txn_id: 0
 txn_time: 127
     user: root
 hostname: localhost
       ip:
       db: employees
      tbl: employees
      idx: PRIMARY
lock_type: RECORD
lock_mode: X
wait_hold: w
   victim: 0
    query: update employees.employees set last_name='deadlock' where emp_no=10105
*************************** 2. row ***************************
   server: localhost.localdomai
       ts: 2017-04-04 00:45:44
   thread: 22
   txn_id: 0
mysql>

また、pt-deadlock-logger のコマンドを実行したコンソールにも情報が標準出力されます

[root@localhost Et]# pt-deadlock-logger --create-dest-table --dest D=test, t=deadlocks
server ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query
localhost.localdomain 2017-04-04T00:45:44 21 0 127 root localhost  employees employees PRIMARY RECORD X w 0 update employees.employees set last_name='deadlock' where emp_no=10105
localhost.localdomain 2017-04-04T00:45:44 22 0 107 root localhost  employees employees PRIMARY RECORD X w 1 update employees.employees set last_name='deadlock' where emp_no=10105

良い点

期間を指定してバックグラウンドで起動させ、指定のデータベーステーブルへデッドロック情報を保存したりする事が可能なので、デッドロックの監視を行う際等に有効です

その他

MySQL5.6 以降では、innodb_print_all_deadlocks を有効にすると同様の情報がエラーログへ記録されます