刘博:携程技术保障中心数据库高级经理,主要关注Sql服务器和Mysql的运维和故障处理。
版本号:5.6.21
隔离级别:可重复读
接到监控报警,有一个线上的应用僵局报错,每15分钟会准时出现,报错统计如下图:
登录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僵局故障排查全过程记录