13.7.6.4 KILL 声明

KILL [CONNECTION | QUERY] processlist_id

mysqld的每个连接均在单独的线程中运行。您可以使用KILL processlist_id语句终止线程。

线程进程列 table 标识符可以从INFORMATION_SCHEMA PROCESSLISTtable 的ID列,SHOW PROCESSLIST输出的Id列和 Performance Schema threadstable 的PROCESSLIST_ID列中确定。当前线程的值由CONNECTION_ID()函数返回。

KILL允许使用可选的CONNECTIONQUERY修饰符:

  • KILL CONNECTIONKILL相同,但没有修饰符:终止与给定* processlist_id *关联的连接,在终止该连接正在执行的任何语句之后。

  • KILL QUERY终止连接当前正在执行的语句,但保持连接本身不变。

查看哪些线程可被杀死的能力取决于PROCESS特权:

  • 如果没有PROCESS,则只能看到自己的线程。

  • 使用PROCESS,您可以看到所有线程。

杀死线程和语句的能力取决于SUPER特权:

  • 如果没有SUPER,则只能杀死自己的线程和语句。

  • 使用SUPER,您可以杀死所有线程和语句。

您还可以使用mysqladmin processlistmysqladmin kill命令检查并杀死线程。

Note

不能将KILL与嵌入式 MySQL 服务器库一起使用,因为嵌入式服务器仅在主机应用程序的线程内运行。它不会自己创建任何连接线程。

当您使用KILL时,将为该线程设置特定于线程的 kill 标志。在大多数情况下,线程死亡可能需要一些时间,因为仅在特定时间间隔检查 kill 标志:

  • SELECT操作期间,对于ORDER BYGROUP BY循环,在读取一行行之后检查该标志。如果设置了 kill 标志,该语句将中止。

  • 进行 table 复制的ALTER TABLE操作会针对从原始 table 读取的每几条复制的行定期检查 kill 标记。如果设置了 kill 标志,该语句将中止并删除临时 table。

KILL语句返回而无需 await 确认,但是 kill 标志检查会在相当短的时间内中止操作。中止该操作以执行任何必要的清理也需要一些时间。

  • UPDATEDELETE操作期间,将在读取每个块之后以及在每个更新或删除的行之后检查 kill 标志。如果设置了 kill 标志,该语句将中止。如果您不使用事务,则更改不会回滚。

  • GET_LOCK()中止并返回NULL

  • 如果线程在 table 锁处理程序中(状态:Locked),则 table 锁将快速中止。

  • 如果线程正在 await 写调用中的可用磁盘空间,则写操作将中止,并显示“磁盘已满”错误消息。

Warning

杀死MyISAMtable 上的REPAIR TABLEOPTIMIZE TABLE操作会导致 table 已损坏且无法使用。在对该 table 进行的任何读取或写入操作都将失败,直到您再次对其进行优化或修复(不间断)。