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
表上将导致表变得损坏且不可用。对这样的表的任何读取或写入操作都将失败,直到您再次优化或修复它(不中断)。