update大量数据引发的故障


摘要:mysql更新大量数据引发的故障处理记录1

发现故障

2017-03-29日晚上20点30突然同时收到2条微信告警:(mysql告警:threads_running超过阀值,os告警:cpu usage超过阀值)

Type: mysql
Tags: XXX
Host: 192.168.XXX.XXX:3306
Level: critical
Item: threads_running
Value: 314
Message: too many threads running
Type: os
Tags: XXX
Host: 192.168.XXX.XXX:
Level: critical
Item: cpu_idle
Value: 39%
Message: too little cpu idle

处理故障

第一时间登录数据库查看当前运行的SQL:
图1
查看慢查询:
图2
发现该SQL就是阻塞的根源!
查看当前连接数,发现有800多个并发连接卡住,于是第一时间kill掉这些连接以保证业务正常!kill掉连接后数据库连接数下降到正常范围,同时主机CPU也恢复正常!

分析故障

通过分析这个SQL语句,发现identifying_code字段上是有索引的,这个where条件匹配到的数据存在大量重复(最多的一个identifying_code有十几W行):
图3
而且这些数据中大部分的delete_flag已经是1了。可见这个SQL每次都是将大部分1改为1,并发量大的时候导致每次都锁很多行最终导致连接阻塞。因此可以优化SQL为如下:

UPDATE XXX
set
delete_flag = 1
where
identifying_code = '1517bfd3f7f4558885a' and delete_flag = 0;

这样每次都只将delete_flag为0的改为1,这个条件过滤后每次符合条件的数据只有1行。就避免了每次update大量数据,减少行锁的发生!

故障总结

这个属于开发的业务逻辑没考虑完善,同时作为DBA没有结合业务做更细的SQL审核也需要自我检讨。

文章目录
  1. 1. 发现故障
  2. 2. 处理故障
  3. 3. 分析故障
  4. 4. 故障总结
|