MySQL僵局故障排查全过程记录

  


  

  

刘博:携程技术保障中心数据库高级经理,主要关注Sql服务器和Mysql的运维和故障处理。

  


  

  

版本号:5.6.21
  

  

隔离级别:可重复读

  


  

  

接到监控报警,有一个线上的应用僵局报错,每15分钟会准时出现,报错统计如下图:

  

癕ySQL僵局故障排查全过程记录”
  

  

登录Mysql服务器查看日志:
  

        mysql>显示引擎innodb状态\ G      * * *(1)事务:      11秒开始索引读取事务102973,活跃      在使用mysql表3,锁定3      锁等待4锁结构(s),堆大小1136,3行锁(s)      MySQL线程id 6, OS线程处理140024996574976,查询id 83 localhost我们更新      更新TestTable      column1=1,      Column2=sysdate (),      Column3=' 026 '      Column4=0      和column5=485      和column6=翱死省?      * * *(1)等待这个锁被授予:      记录锁空间id 417页1493 n比特1000指数idx_column6表测试。TestTable trx id 102973 lock_mode X等待      记录锁,堆没有859物理记录:n_fields 2;紧凑的格式;信息比特0      0:len 3;十六进制53454 b;asc克朗;;      1:len 8;十六进制80000000007 e1452;asc ~ R;;      * * *(2)事务:      26秒开始索引读取事务102972,活跃      在使用mysql表3,锁定3      219锁结构(s),堆大小24784,2906行锁,undo日志条目7      MySQL线程id 5, OS线程处理140024996841216,查询id 84 localhost我们更新      更新TestTable      Column1=1,      Column2=sysdate (),      Column3=' 026 '      Column4=0      和Column5=485      和Column6=翱死省?      * * *(2)持有的锁(S):      记录锁空间id 417页1493 n比特1000指数idx_Column6表测试。TestTable trx id 102972 lock_mode X      记录锁,堆第一物理记录:n_fields 1;紧凑的格式;信息比特0      0:len 8;十六进制73757072656 d756d;asc上确界;;         记录锁,堆没有859物理记录:n_fields 2;紧凑的格式;信息比特0      0:len 3;十六进制53454 b;asc克朗;;      1:len 8;十六进制80000000007 e1452;asc ~ R;;            * * *(2)等待这个锁被授予:      记录锁空间id 601页89642 n比特1000指数idx_column6表测试。TestTable trx id 32231892482 lock_mode X锁rec但不是差距等      记录锁,堆没有38物理记录:n_fields 2;紧凑的格式;信息比特0      0:len 3;十六进制53454 b;asc克朗;;      1:len 8;十六进制80000000007 eea14;asc ~;;      

大致一看,更新同一索引的同一行,应该是一个块,报超时的错才对,怎么会报僵局# 63;

  


  

  

先分析下(2)事务,事务32231892482。
  

  

等待的锁信息为:
  

        0:len 3;十六进制53454 b;asc克朗;;      1:len 8;十六进制80000000007 eea14;asc      

持有的锁信息为:
  

        0:len 3;十六进制53454 b;asc克朗;;      1:len 8;十六进制80000000007 eeac4;asc      

再先分析下(1)交易,交易32231892617。
  

  

等待的锁信息为:
  

        0:len 3;十六进制53454 b;asc克朗;;      1:len 8;十六进制80000000007 eeac4;asc      

于是可以画出的死锁表,两个资源相互依赖,造成死锁:
  

  

           事务   持有   等待               32231892617   53454 b \ 80000000007 eea14   53454 b \ 80000000007 eeac4         32231892482   53454 b \ 80000000007 eeac4   53454 b \ 80000000007 eea14            

  

让我们再看一下解释结果:
  

  
  

mysql> desc更新TestTable组Column1=1, Column2=sysdate (), Column3=025”Column4=0和Column5=477 Column6=翱死省盶 G;

  

* * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *

  

id: 1   

select_type:更新   

表:TestTable   零

分区:   

类型:index_merge   

possible_keys: column5_index、idx_column5_column6_Column1 idxColumn6

MySQL僵局故障排查全过程记录