设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 站长学院 > MySql教程 > 正文

怎么处理Mysql Sleep线程引发的锁等待故障

发布时间:2022-01-19 13:24 所属栏目:115 来源:互联网
导读:本篇内容主要讲解怎么解决Mysql Sleep线程引发的锁等待故障,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习怎么解决Mysql Sleep线程引发的锁等待故障吧! 背景: 负责的生产库出现告警too many connections. 解决
      本篇内容主要讲解“怎么解决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;
 
2. 此时看到这个场景,大家大概率都会以为是表tbl_prod的ID没有索引所以是全表查找更新,然而看到执行计划却发现并不是,反而是主键更新。
 
explain UPDATE tbl_prod SET status=1 WHERE id = 1198445;
 
3. 随后查看innodb引擎当前的状态,发现很有意思的事了,这些update线程都在等待锁,以其中一个线程为例。
 
show engine innodb status\G
 
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;

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读