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