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允许使用可选的CONNECTION
或QUERY
修饰符:
-
KILL CONNECTION与KILL相同,但没有修饰符:终止与给定*
processlist_id
*关联的连接,在终止该连接正在执行的任何语句之后。 -
KILL QUERY终止连接当前正在执行的语句,但保持连接本身不变。
查看哪些线程可被杀死的能力取决于PROCESS特权:
杀死线程和语句的能力取决于SUPER特权:
您还可以使用mysqladmin processlist和mysqladmin kill命令检查并杀死线程。
Note
不能将KILL与嵌入式 MySQL 服务器库一起使用,因为嵌入式服务器仅在主机应用程序的线程内运行。它不会自己创建任何连接线程。
当您使用KILL时,将为该线程设置特定于线程的 kill 标志。在大多数情况下,线程死亡可能需要一些时间,因为仅在特定时间间隔检查 kill 标志:
-
在SELECT操作期间,对于
ORDER BY
和GROUP BY
循环,在读取一行行之后检查该标志。如果设置了 kill 标志,该语句将中止。 -
进行 table 复制的ALTER TABLE操作会针对从原始 table 读取的每几条复制的行定期检查 kill 标记。如果设置了 kill 标志,该语句将中止并删除临时 table。
KILL语句返回而无需 await 确认,但是 kill 标志检查会在相当短的时间内中止操作。中止该操作以执行任何必要的清理也需要一些时间。
-
在UPDATE或DELETE操作期间,将在读取每个块之后以及在每个更新或删除的行之后检查 kill 标志。如果设置了 kill 标志,该语句将中止。如果您不使用事务,则更改不会回滚。
-
GET_LOCK()中止并返回
NULL
。 -
如果线程在 table 锁处理程序中(状态:
Locked
),则 table 锁将快速中止。 -
如果线程正在 await 写调用中的可用磁盘空间,则写操作将中止,并显示“磁盘已满”错误消息。
Warning
杀死MyISAM
table 上的REPAIR TABLE或OPTIMIZE TABLE操作会导致 table 已损坏且无法使用。在对该 table 进行的任何读取或写入操作都将失败,直到您再次对其进行优化或修复(不间断)。