程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> mysql 如何記錄全部的死鎖

mysql 如何記錄全部的死鎖

編輯:MYSQL入門知識
 

我們都知道使用命令:

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的出錯日志中。。
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved