近日在客户现场碰到一个典型MDL锁导致交易失败的案例,记录一下
客户交易场景在9月19号的0点时候报错,报错持续到2:40左右,之后业务就恢复了。
排查过程:
1.根据客户反馈,交易在0点开始失败,如下图:
2.查询对应时间段的mysql运行状态,发现该时间段内相关交易均被堵塞,SQL执行失败,应用段日志报错为锁超时lock wait timeout exceeded;
3.查询慢SQL日志,发现均为5S的慢查询SQL,非常有规律,查询元数据锁超时lock_wait_timeout参数,确定该参数设置为5S;
4.至此,可以初步确定该问题为元数据锁等待导致的业务阻塞(具体是什么元数据锁导致的需进一步分析;
5.由于已经没有对应时间点的相关历史会话及锁信息,只能根据相关binlog信息倒推,解析对应时间段的binlog日志,并逐步分析,最终定位到如下创建分区语句执行时间为6小时,与对应时间段的数据库线程等待信息一致:
6.据以上信息,确认为应用端持续的慢SQL select导致该分区表持续持有MDL S锁不释放,进而导致分区在0:00执行添加分区DDL操作时无法加MDL X锁而进入线程等待,反过来进一步导致所有涉及到该表的事务均失败。
7.经与客户确认该凌晨有持续的批量业务执行,导致的该问题,建议客户修改批量业务时间或者调整创建新分区的定时任务时间,来规避该问题。