【MySQL运维】锁问题排查与处理教程,正确找到被锁的语句
1、首先简单的制造一个锁
#事务A mysql> begin; mysql> delete from action1 where id = 3; #事务B mysql> update action1 set id = 7 where id = 3;
2、通过show processlist命令只能看到事务B的语句一直处于执行中的状态,但是并不知道为什么被锁住。如果state字段出现很多waiting for ... lock,大概率也是出现了死锁,但是show processlist无法定位原因
3、查看是否存在表锁,只要大于0就代表有表正在被锁
mysql > show open tables where in_use > 0 ;
4、通过information_schema自带的三张表可以获得当前数据库锁信息
· innodb_trx:查看当前正在执行的事务,主要关注trx_weight、trx_rows_modified、trx_rows_locked这几个值,它们代表了事务的大小和影响行数
SELECT * FROM information_schema.innodb_trx ; #查看正在执行的事务,通过weight值和 SELECT * FROM information_schema.innodb_locks ; #查看锁 SELECT * FROM information_schema.innodb_lock_waits; #查看被阻塞和产生阻塞的事务,但是这里的ID为数据库内部ID,并不能很快速的处理 SELECT * FROM sys.innodb_lock_waits #将information_schema.innodb_lock_waits的信息进行了整理,方便用kill命令处理
5、sys.innodb_lock_waits解析
waiting_trx_id:等待锁释放的线程ID,属于MySQL内部的ID
waiting_query_secs:因为锁导致事务的等待时间
waiting_pid:等待锁的事务ID,也就是show processlist看到的ID
waiting_query:因为锁被阻塞的SQL语句
blocking_trx_id:导致锁的线程ID,属于MySQL内部的ID
blocking_pid:导致锁的事务ID,,也就是show processlist看到的ID,通常是KILL的对象
版权声明:本文章版权归数据库运维网(www.ywdba.cn)所有。如需引用本站内容,请注明来源及作者。
评论