发现故障
2017-03-29日晚上20点30突然同时收到2条微信告警:(mysql告警:threads_running超过阀值,os告警:cpu usage超过阀值)
处理故障
第一时间登录数据库查看当前运行的SQL:
查看慢查询:
发现该SQL就是阻塞的根源!
查看当前连接数,发现有800多个并发连接卡住,于是第一时间kill掉这些连接以保证业务正常!kill掉连接后数据库连接数下降到正常范围,同时主机CPU也恢复正常!
分析故障
通过分析这个SQL语句,发现identifying_code字段上是有索引的,这个where条件匹配到的数据存在大量重复(最多的一个identifying_code有十几W行):
而且这些数据中大部分的delete_flag已经是1了。可见这个SQL每次都是将大部分1改为1,并发量大的时候导致每次都锁很多行最终导致连接阻塞。因此可以优化SQL为如下:
这样每次都只将delete_flag为0的改为1,这个条件过滤后每次符合条件的数据只有1行。就避免了每次update大量数据,减少行锁的发生!
故障总结
这个属于开发的业务逻辑没考虑完善,同时作为DBA没有结合业务做更细的SQL审核也需要自我检讨。