MySQL 挂起处于终止状态

4 mysql myisam optimization hang

我有一个奇怪的情况,mysql OPTIMIZE 查询永远不会结束。Killinh 后,它仍处于“killed”状态。

重现场景:

  • 操作系统:CentOS 6.5
  • MySQL:5.6
  • 引擎:MyISAM(至少有一个 BLOB/LONGTEXT 列)
  • mysql 配置'myisam_repair_threads' = 2

我有一个包含 40MB 数据和 1500 条记录的表。当 myisam_repair_threads 设置为 1 时,OPTIMIZE 将在一秒钟内完成。将 myisam_repair_threads 设置为 2 需要很长时间才能完成。终止查询后,它仍处于“已终止”状态(在撰写本文时已经 3 小时了)。看来这是mysql的一个bug。

然而,最大的问题是:我怎样才能强制终止这个查询?它当前持有表元数据的锁,因此某些进程无法执行,因为它们正在等待该锁。

任何建议表示赞赏!

小智 5

来自DBA Square 博客

\n
\n

当你运行 KILL 时实际上会发生什么?

\n

命令 sytnax 是 KILL [QUERY | CONNECTION] <thread_id>,其中thread_id 是进程列表输出的第一列的值。可选参数确定是仅运行查询还是终止整个会话。默认为后者,因此\n不需要指定 CONNECTION。

\n

除了在选定线程内设置特殊标志之外,运行该命令实际上不会执行任何操作。因此,kill\n操作不会与相应的请求同步发生。\n在许多情况下,线程或查询需要一些时间才能停止。在语句执行的各个阶段都会检查\n标志。它何时发生或发生的频率取决于线程实际执行的工作。

\n
\n

...

\n
\n

无论真正的原因是什么,都不可能在不重新启动数据库的情况下摆脱\n此类挂起的线程。然而,他们应该被允许自行离开。

\n

也没有办法像Unix系统中的kill -9那样强制立即执行kill。

\n
\n