2013年2月14日木曜日

innodb_print_all_deadlocksを試してみる

MySQL5.6の新機能(といいつつ5.5.30にもバックポートされてる)、
一部で念願だったデッドロックのログ機能を試してみる。

my.cnfにごにょごにょ。

[mysqld]loose-innodb-print-all-deadlocks

オプション名の先頭にloose-って付けると、
そのオプションが存在しないバージョンでもエラーにならずにワーニングで済むんですよ!
 ⇒出典 かみぽわーる さん

起動して、取り敢えずデッドロックさせてみる。


$ less error.log2013-02-14 17:55:31 7fc810773700InnoDB: transactions deadlock detected, dumping detailed information.2013-02-14 17:55:31 7fc810773700*** (1) TRANSACTION:TRANSACTION 5638, ACTIVE 12 sec starting index readmysql tables in use 1, locked 1LOCK WAIT 3 lock struct(s), heap size 1248, 2 row lock(s)MySQL thread id 6, OS thread handle 0x7fc810732700, query id 55 localhost root statisticsselect * from t1 where num = 2 for update*** (1) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 11 page no 4 n bits 320 index `num` of table `d2`.`t1` trx id 5638 lock_mode X locks rec but not gap waitingRecord lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 8; hex 0000000000000002; asc         ;; 1: len 6; hex 000000001548; asc      H;; 2: len 7; hex bd000001640120; asc     d  ;; 3: len 0; hex ; asc ;;
*** (2) TRANSACTION:TRANSACTION 5639, ACTIVE 6 sec starting index readmysql tables in use 1, locked 13 lock struct(s), heap size 1248, 2 row lock(s)MySQL thread id 8, OS thread handle 0x7fc810773700, query id 56 localhost root statisticsselect * from t1 where num = 1 for update*** (2) HOLDS THE LOCK(S):RECORD LOCKS space id 11 page no 4 n bits 320 index `num` of table `d2`.`t1` trx id 5639 lock_mode X locks rec but not gapRecord lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 8; hex 0000000000000002; asc         ;; 1: len 6; hex 000000001548; asc      H;; 2: len 7; hex bd000001640120; asc     d  ;; 3: len 0; hex ; asc ;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:RECORD LOCKS space id 11 page no 4 n bits 320 index `num` of table `d2`.`t1` trx id 5639 lock_mode X locks rec but not gap waitingRecord lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 8; hex 0000000000000001; asc         ;; 1: len 6; hex 000000001548; asc      H;; 2: len 7; hex bd000001640110; asc     d  ;; 3: len 0; hex ; asc ;; 

*** WE ROLL BACK TRANSACTION (2)
おおお、吐いた!
SHOW ENGINE INNODB STATUSのLATEST DETECTED DEADLOCKと同じ内容がまるっと取れる。
これは便利…か?

pt-deadlock-loggerはテーブルに吐くから…と思っている時には良いかも。

MariaDBみたいにシンプルに[Error] Deadlock found~みたいに、ログをチェックする用途には向かないと思う。
いや、Deadlockはエラーじゃないから正常系だからせめてWarningで出せよとか思う訳ですがまあ。。

130214 18:16:27 [ERROR] mysqld: Deadlock found when trying to get lock; try restarting transaction
これってXtraDB側の仕様で、Percona Serverでもこうだったりする?

0 件のコメント :

コメントを投稿