背景
MES 工厂反馈业务查询慢,登录数据库手工执行 SQL 操作也没有响应,怀疑是 02:00 执行的备份任务导致。
分析
- 登录数据库,执行 show processlist查看当前会话,发现大量线程状态为Waiting for tables flush。
| 1 | mysql> show processlist; | 
- 找到首次出现此状态执行的操作 - FLUSH NO_WRITE_TO_BINLOG TABLES,执行时间- 6125s,线程ID- 3082727,这是- XtraBackup执行全量备份的一个线程,主要作用是关闭所有打开的表,强制关闭所有正在使用的表,并刷新查询缓存和预准备语句缓存。
- 备份正常执行这个操作是不会锁表的,但是如果在此期间存在慢查询 - CALL procedure_imp_table,执行时间- 12515s,线程ID- 3080884,就会占用全局只读锁,阻止关闭打开的表。
- 结论:使用 - mysqldump、XtraBackup备份期间出现了慢查询并且慢查询长时间阻塞,就会出现- Waiting for tables flush。
解决
- 找出超时的慢查询,执行 kill 3080884,问题解决
| 1 | mysql> kill 3080884; |