我們都知道使用命令:
SHOW engine innodb STATUS \G
可以看到死鎖的記錄,
不過僅僅是
LATEST DETECTED DEADLOCK。
也就是說很有可能看不全。。。
除非你每秒去執行一下show engine innodb status。。。
只能借助外部的工具了:
pt-deadlock-logger
http://www.percona.com/doc/percona-toolkit/2.1/pt-deadlock-logger.html
它會監視show engine innodb status的輸出,
把死鎖的記錄保存到文件或者數據表中。
看一下如何操作:
# pt-deadlock-logger --create-dest-table --dest D=test,t=deadlocks u=root,h=127.0.0.1
–dest 表示保存到數據庫。 D是數據庫名,t是表名。
mysql> SHOW CREATE TABLE test.deadlocks\G
*************************** 1. ROW ***************************
TABLE: deadlocks
CREATE TABLE: CREATE TABLE `deadlocks` (
`server` CHAR(20) NOT NULL,
`ts` datetime NOT NULL,
`thread` INT(10) UNSIGNED NOT NULL,
`txn_id` BIGINT(20) UNSIGNED NOT NULL,
`txn_time` SMALLINT(5) UNSIGNED NOT NULL,
`user` CHAR(16) NOT NULL,
`hostname` CHAR(20) NOT NULL,
`ip` CHAR(15) NOT NULL,
`db` CHAR(64) NOT NULL,
`tbl` CHAR(64) NOT NULL,
`idx` CHAR(64) NOT NULL,
`lock_type` CHAR(16) NOT NULL,
`lock_mode` CHAR(1) NOT NULL,
`wait_hold` CHAR(1) NOT NULL,
`victim` tinyint(3) UNSIGNED NOT NULL,
`query` text NOT NULL,
PRIMARY KEY (`server`,`ts`,`thread`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
開始監視:
# pt-deadlock-logger --daemonize --run-time=3000 --dest D=test,t=deadlocks u=root,h=127.0.0.1
獲取結果:
mysql> SELECT * FROM test.deadlocks\G
*************************** 1. ROW ***************************
server: 127.0.0.1
ts: 2012-09-17 12:13:36
thread: 32
txn_id: 0
txn_time: 113
USER: root
hostname: localhost
ip:
db: world
tbl: City
idx: Name
lock_type: RECORD
lock_mode: X
wait_hold: w
victim: 0
query: UPDATE City SET name='New york2' WHERE name='New York'
*************************** 2. ROW ***************************
server: 127.0.0.1
ts: 2012-09-17 12:13:36
thread: 33
txn_id: 0
txn_time: 110
USER: root
hostname: localhost
ip:
db: world
tbl: City
idx: Name
lock_type: RECORD
lock_mode: X
wait_hold: w
victim: 1
query: UPDATE City SET Name='Seattle2' WHERE name='Seattle'
保存到數據表中,就可以使用sql語句(比如group by)做出某些統計了。
不過mysql5.6自帶這個功能了:
http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_print_all_deadlocks
再不過,它只能保存到mysql的出錯日志中。。