问题:

Mysql查询被挂起,进程列表显示:“Waiting for Table Flush 正在等待表刷新”。

MySQL 查询僵死 - “Waiting for Table Flush”
查看更多教程 https://on  itroad.com

解决方法

这个问题有两个主要原因。
最明显和最容易检测到的是挂起的 FLUSH TABLES WITH READ LOCK 。
很明显,因为在进程列表中可以看到挂起的 FLUSH。

不太明显的是由执行 ANALYZE、OPTIMIZE、RENAME、ALTER、REPAIR 或者任何其他更改基础表的统计信息或者定义的命令引起的内部表刷新。
执行这样的命令后,会在内部发出 FLUSH TABLE 以重新读取表定义和统计信息。
如果在发出 FLUSH TABLE 时正在运行访问该表的查询,则 FLUSH TABLE 将被阻塞,直到查询完成。
当 FLUSH TABLE 被阻止时,访问受影响表的新查询不能开始运行,它们在进程列表中的状态将显示“等待表刷新”。

导致 FLUSH TABLE 的原始命令将成功结束,并且不会出现在进程列表中,因此很难确切知道发生了什么。

对于被挂起的 FLUSH TABLES WITH READ LOCK 阻塞的查询,恢复业务的简单解决方法是简单地终止发出 FLUSH TABLES WITH READ LOCK 的进程。

对于被挂起的 FLUSH TABLE 阻塞的查询,解决方案并不那么简单。
终止处于“等待表刷新”状态的查询不会解决问题。
解决问题的方法有以下三种:

  • 等待阻塞 FLUSH TABLE 的长时间运行的查询完成;
  • 识别长时间运行的查询并杀死它们;
  • 重启服务器

请注意,提到的三个选项是选项,而不是步骤。
没有必要同时做这三件事。

日期:2020-09-17 00:11:16 来源:oir作者:oir