情况描述:
读写分离环境,Mysql 主库正常。
备库存在大查询持续了7个小时之久。
夜间10点备份启动出现waiting for table flush 等待事件。
备份后面进来的会话出现积压且前台应用被阻塞。
处理过程:
收到报警后检查主从延迟情况,show slave status\G;
有延迟。
select * from information_schema.processlist order by time desc; 检查当前session 的执行情况。
看到有4个session 执行了28000s 未执行完成, 有会话处于waiting for table flush 状态。此4个会话从堡垒机终端过来确定不是应用中的session。
将此4个session kill 掉, show processlist 查看会话状态, 恢复正常, 主从延迟追平。
故障处理过后回想什么原因导致会话积压,前台应用被阻塞。
大查询未结束。
mysqldump 在备份时会进行flush table 操作出现等待。
flush table 操作无法完成后面的session 被阻塞。
测试环境复现场景中发现的现象:
1. 使用mysqldump 在备库进行备份,备份sql中不加--single-transaction 时,主库中对表进行update 操作从库的sql_thread 线程会被mdl 锁阻塞,出现主从延迟。
需要掌握的知识点:
mysqldump 备份的整个过程:
https://www.cnblogs.com/digdeep/p/12455757.html
MDL 锁:
https://www.cnblogs.com/zengkefu/p/5690385.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21374452/viewspace-2853824/ ,如需转载,请注明出处,否则将追究法律责任。