mysql 5. 锁等待_查看MySQL锁等待的原因

--sys库的介绍

mysql 5.6也可以有sys库(基于performance_schema的视图)。sys库是一个开源项目,在githup上早就有,是一个DBA的开源工具,后来mysql感觉好,就放在了mysql5.7上。

下载地址:https://github.com/mysql/mysql-sys

[tms@m-db3 ~]$ cd mysql-sys-master

[tms@m-db3 ~]$ mysql < sys_56.sql

这样,就可以在mysql5.6里面加入sys库了,不过mysql 5.6只有88张表,而mysql 5.7有101张,这是因为Mysql 5.7的performace_schema库里面又多了几张表。

sys库是performance_schema的视图。

--MySQL锁等待

当Mysql发生锁等待情况时,可以通过如下语句来在线查看:

上面看到输出了很多的东西,看的我都蒙圈了。后来查看mysql官方文档,慢慢的才发现,其实只关注上面的waiting_pid、waiting_query和blocking_pid、blocking_query四个参数即可;其中waiting_pid和blocking_pid两个参数就是通过执行show processlist命令里面输出的线程id号,如下:

通过上面两个的输出结果,我们明白了,是441803线程锁住了表,造成线程441805的等待。

我们看到发生等待的线程441805对应的sql语句是:update busi_reconciliationgbgs ... where id = 4510,但是锁表的线程441803对应的sql语句竟然是Null。这就更让人迷惑了。

于是我默默的翻开了ysql官方文档,原来里面已经对这个null专门做了说明。

官方文档说,要想找到这个null值对应的阻塞语句,可以通过下面几个步骤寻找:

a)、根据锁表的processlist id 441803,运用如下sql,找到null对应的sql语句,如下:

b)、如果上面找到的sql语句,你还是不能分析出为什么他们会锁表,一直拿着锁不释放,那么你可以查看 performance_schema.events_statements_history表里面最近执行过的10条sql(假设上面查到的thread_id=28):

其他:

上面查询锁的sql可以只关注已下几个列,如下:

~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~

最近我用python 2.6写了个自动杀锁的脚本,只要发现sys.innodb_lock_waits表里面有锁表的内容,就杀死相应的sql线程,并输出杀死sql的内容到当前目录下:

--参考文档:

https://dev.mysql.com/doc/refman/8.0/en/sys-innodb-lock-waits.html

https://dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-examples.html#innodb-information-schema-examples-null-blocking-query

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值