怎么解决Mysql Sleep线程引发的锁等待故障

发布时间:2021-08-26 14:40:51 作者:chen
来源:亿速云 阅读:539

本篇内容主要讲解“怎么解决Mysql Sleep线程引发的锁等待故障”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决Mysql Sleep线程引发的锁等待故障”吧!

背景:

负责的生产库出现告警too many connections.

解决过程:

1. 第一反应就是出现了大量的连接或者是DDL把实例打满了,随即登上实例尝试登陆,却发现已经连不上了。然后动态调大连接数后。使用如下SQL看到大量的UPDATE线程未执行完。

select id,host,user,db,command,state,time,left(info,200) from information_schema.processlist where command <>'Sleep' order by time desc limit 100;

    怎么解决Mysql Sleep线程引发的锁等待故障

2. 此时看到这个场景,大家大概率都会以为是表tbl_prod的ID没有索引所以是全表查找更新,然而看到执行计划却发现并不是,反而是主键更新。

explain UPDATE tbl_prod SET status=1 WHERE id = 1198445;

怎么解决Mysql Sleep线程引发的锁等待故障

3. 随后查看innodb引擎当前的状态,发现很有意思的事了,这些update线程都在等待锁,以其中一个线程为例。

show engine innodb status\G

怎么解决Mysql Sleep线程引发的锁等待故障

4. 此时基本上可以断定是有长事务未提交导致的大量主键更新等待了。我们采用如下SQL可以找到这个长连接。

select p.host,p.time,t.trx_mysql_thread_id,t.trx_started,left(p.info,100) from information_schema.innodb_trx t join information_schema.processlist p  on t.trx_mysql_thread_id =p.id order by time desc,t.trx_started desc limit 20;

怎么解决Mysql Sleep线程引发的锁等待故障

5. 可以看到上面的第一条执行时间最长的为NULL的线程占用锁时间最长,其后则是大量的update等待线程了。那么我们将这个最长的null线程给KILL掉,问题即得到解决。

kill 2323514;

到此,相信大家对“怎么解决Mysql Sleep线程引发的锁等待故障”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. Mysql Too many connections解决方案
  2. C#中关于Timer定时器重入问题如何解决

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:Redis集合set的常用命令

下一篇:基于php数组中的索引数组和关联数组怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》