mysql300个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;

5b30d671a6c6231bc7ca2340d935002e.png

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

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

f3d3b622cddbaf1572d5dad73efdbaaf.png

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

show engine innodb status\G

293bce879a46e3a3a39764391575bf19.png

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;

2f88d3a3561887ef080481152e3405b1.png

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

kill 2323514;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQLsleep线程过多时,可能会出现以下几种情况和解决方法: 1. 过多的sleep线程可能会导致数据库的性能下降。因为每个sleep线程都占用一定的系统资源,当这些线程的数量过多时,会导致系统资源的消耗增加,从而影响数据库的性能。解决方法是通过增加max_connections或者调整wait_timeout参数来限制sleep线程的数量。 2. 过多的sleep线程可能是由于连接池没有正确关闭连接导致的。连接池负责管理数据库连接的分配和回收,在请求处理完毕后应该将连接释放回连接池,但如果没有正确关闭连接,则会导致sleep线程的增多。解决方法是确保在请求处理完毕后正确关闭连接,并且及时释放连接资源。 3. 过多的sleep线程可能是由于长时间的事务或者定操作导致的。在MySQL中,事务或者定操作会导致连接处于waiting状态,从而导致sleep线程增多。解决方法是尽量缩短事务的执行时间,避免长时间的事务操作,并且合理使用定机制,避免不必要的定操作。 4. 过多的sleep线程也可能是由于代码中的延迟操作导致的。如果应用程序中存在大量的延迟操作,比如sleep函数,可能会导致数据库中的sleep线程增多。解决方法是优化应用程序的代码,避免不必要的延迟操作,以减少数据库中sleep线程的数量。 综上所述,当MySQLsleep线程过多时,我们可以通过增加max_connections、调整wait_timeout参数、正确关闭连接、缩短事务执行时间、合理使用定机制、优化应用程序代码等方法来解决问题,并提高数据库的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值