MySQL死锁分析工具------pt-deadlock-logger

摘要:

死锁:是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象;当产生死锁的时候,MySQL会回滚一个小事务的SQL,确保另一个完成。上面是死锁的概念,而在MySQL中 innodb 会出现死锁的情况,但是查看死锁却很不“智能”。只能通过 show engine innodb status 查看,但只保留最后一个死锁的信息,之前产生的死锁都被刷掉了。下面介绍的工具却很容易做到记录。

前提:

安装方法:perl Makefile.PL;make;make install

使用方法:

pt-deadlock-logger [OPTIONS] DSN

--run-time或 --iterations。

用法:

pt-deadlock-logger--ask-pass --run-time=10 --interval=3 --create-dest-table --dest D=test,t=deadlocks u=root,P=3306,h=192.168.200.25

Enter MySQL password:

参数:

--create-dest-table :创建指定的表。--dest :创建存储死锁信息的表。--database :-D,指定链接的数据库。--table :-t,指定存储的表名。--log :指定死锁日志信息写入到文件。--run-time :运行次数,默认永久--interval :运行间隔时间,默认30s。

u,p,h,P :链接数据库的信息。

以上的参数,已经够用,更多的参数信息见官网说明。

测试:

运行 pt-deadlock-logger ,操作数据库:

session1:

root@localhost : test 04:46:11>select* fromdead_tab;+----+------+------+---------+

| id | name | age | address |

+----+------+------+---------+

| 1 | a | 33 | NULL |

| 2 | bbb | 34 | NULL |

| 3 | bbb | 35 | NULL |

+----+------+------+---------+

3 rows in set(0.00sec) root@localhost : test 04:46:24>start transaction;Query OK,0 rows affected (0.00sec)

root@localhost : test 04:46:31>updatedead_tab set name ='A' where id >2;Query OK,1 row affected (0.00sec)

Rows matched:1 Changed: 1 Warnings: 0

section2:

root@localhost : test 04:46:13>start transaction;Query OK,0 rows affected (0.01sec)

root@localhost : test 04:46:48>updatedead_tab set name='AA' where id >1;…………

…………

一直在等待着...

回到session1:

root@localhost : test 04:46:44>updatedead_tab set name ='AA' where id >1;ERROR1213 (40001): Deadlock found when trying to get lock; try restarting transaction死锁出现了!

看pt-deadlock-logger的运行情况:

zhoujy@zhoujy:~$ pt-deadlock-logger --ask-pass --create-dest-table --dest D=test,t=deadlocks u=root,P=3306,h=192.168.200.25

Enter MySQL password: server ts thread txn_id txn_timeuserhostname ip db tbl idx lock_type lock_mode wait_hold victim query192.168.200.25 2013-10-28T16:47:00 99 0 8 root localhost test dead_tab PRIMARY RECORD X w 0 update dead_tab set name='AA' where id >1

192.168.200.25 2013-10-28T16:47:00 100 0 16 root localhost test dead_tab PRIMARY RECORD X w 1 update dead_tab set name ='AA' where id >1

死锁被打印出来,看看 是否写到表里 :

root@localhost : test 04:32:45>select * fromdeadlocks\G;*************************** 1. row ***************************server:192.168.200.25ts:2013-10-28 16:47:00thread:99txn_id:0txn_time:8

user: root

hostname: localhost

ip:

db: test

tbl: dead_tab

idx:PRIMARYlock_type: RECORD

lock_mode: X

wait_hold: w

victim:0query:update dead_tab set name='AA' where id >1

*************************** 2. row ***************************server:192.168.200.25ts:2013-10-28 16:47:00thread:100txn_id:0txn_time:16

user: root

hostname: localhost

ip:

db: test

tbl: dead_tab

idx:PRIMARYlock_type: RECORD

lock_mode: X

wait_hold: w

victim:1query:update dead_tab set name ='AA' where id >1

2 rows in set (0.00 sec)

结果表明死锁信息已经写入到了表中,记录的内容是2条产生的sql。继续同样的步骤再执行2次出现死锁的SQL来验证是之前的死锁信息否被刷写掉:

root@localhost : test 04:53:29>selectcount(*) fromdeadlocks;+----------+

| count(*) |

+----------+

| 6 |

+----------+

1 row in set(0.02 sec)

继续被写入到表中。 可以看到多个产生死锁的sql,而不仅仅是最后一条产生死锁的sql 。

总结:

在检查数据库是死锁信息的时候,又多了一个选择。该工具也是通过 show engine innodb status 的信息来计算的。 在mysql 5.6 .2 中, innodb_print_all_deadlocks这个设置可以在错误日志中看到死锁的情况 。
 

你可能感兴趣的:(mysql,adb,数据库)