【MySQL运维】锁问题排查与处理教程,正确找到被锁的语句

TangLu MySQL 2021-04-27 1298 0

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解析企业微信截图_20210923114532.png

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的对象


评论