在生产环境中,有可能会发现业务突然被卡死,很有可能是锁被其他事务持有,所以需要排查哪个会话阻塞了当前业务,排查步骤如下:
1 查看当前被阻塞的会话的id
show processlist;
+----+------+----------------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+----------------------+------+---------+------+----------+------------------+
| 23 | root | 172.19.119.213:50544 | NULL | Query | 0 | xxx | xxx |
+----+------+----------------------+------+---------+------+----------+------------------+
2 查看和MySQL相关的Sequoiadb会话
sdb 'db.snapshot(2,{Source:{$regex:"MySQL.*23$"}},{"SessionID":1})'
{
"SessionID": 45
}
3 找到sessionid对应的事务,并看它获取了哪些锁
sdb 'db.snapshot(9,{"SessionID":{$in:[45]}},{"WaitLock":1})'
{
"WaitLock": {
"CSID": 20,
"CLID": 0,
"ExtentID": 9,
"Offset": 36,
"Mode": "X",
"Duration": 49183
}
}
4 生成查询条件,看锁被哪个sequoiadb会话占用
sdb 'db.snapshot(SDB_SNAP_TRANSACTIONS,{"GotLocks.CSID":20,"GotLocks.CLID":0,"GotLocks.ExtentID":9,"GotLocks.Offset":36,"GotLocks.Mode":"X"},{"SessionID":1})'
{
"SessionID": 43
}
5 去找对应的mysql会话
sdb 'db.snapshot(2,{"SessionID":43,"Source":{$ne:""}},{Source:1})'
{
"Source": "MySQL:tdb21-1:5590:967"
}
通过以上步骤,可以确定,阻塞当前业务的会话在tdb21-1机器上,MySQL会话id为967。如果这个967是被其他人误发起的,可以通过kill命令杀掉会话。