KILL [CONNECTION | QUERY] processlist_id
每个连接到 mysqld 都运行在一个单独的线程中。你可以使用 KILL 语句来终止一个线程。processlist_id
线程进程列表标识符可以从 ID 列的 INFORMATION_SCHEMA PROCESSLIST 表、Id 列的 SHOW PROCESSLIST 输出和 Performance Schema threads 表的 PROCESSLIST_ID 列中确定。当前线程的值由 CONNECTION_ID() 函数返回。
KILL 允许可选的 CONNECTION 或 QUERY 修饰符:
-
KILL CONNECTION与KILL无修饰符相同:它终止与给定processlist_id相关的连接,终止连接当前执行的任何语句。 -
KILL QUERY终止连接当前执行的语句,但保持连接本身不变。
查看哪些线程可以被终止取决于 PROCESS 权限:
终止线程和语句的能力取决于 CONNECTION_ADMIN 权限和已弃用的 SUPER 权限:
-
没有
CONNECTION_ADMIN或SUPER权限,你只能终止自己的线程和语句。 -
有
CONNECTION_ADMIN或SUPER权限,你可以终止所有线程和语句,除了执行具有SYSTEM_USER权限的线程或语句,需要你的会话也具有SYSTEM_USER权限。
你也可以使用 mysqladmin processlist 和 mysqladmin kill 命令来检查和终止线程。
当你使用 KILL 时,线程特定的终止标志将被设置。在大多数情况下,线程可能需要一些时间来死亡,因为终止标志仅在特定间隔检查:
-
在
SELECT操作期间,对于ORDER BY和GROUP BY循环,标志将在读取一块行后检查。如果终止标志被设置,语句将被中止。 -
ALTER TABLE操作将表副本检查终止标志,每读取原始表的几行后。如果终止标志被设置,语句将被中止,临时表将被删除。该
KILL语句将返回而不等待确认,但是kill 标志检查将在合理的时间内中止操作。中止操作以执行必要的清洁工作也需要一些时间。 -
在
UPDATE或DELETE操作期间,kill 标志将在每个块读取和每个更新或删除行后检查。如果kill 标志被设置,语句将被中止。如果您不使用事务,变化将不会回滚。 -
GET_LOCK()将中止并返回NULL。 -
如果线程在表锁处理程序中(状态:
Locked),表锁将快速中止。 -
如果线程在写调用中等待免费磁盘空间,写操作将以“磁盘满”错误信息中止。
-
EXPLAIN ANALYZE将中止并打印输出的第一行。
杀死 REPAIR TABLE 或 OPTIMIZE TABLE 操作在 MyISAM 表上将导致表变得损坏且不可用。对这样的表的任何读取或写入操作都将失败,直到您再次优化或修复它(不中断)。