KILL [CONNECTION | QUERY] processlist_id
每个到 mysqld 的连接都在一个单独的线程中运行。您可以使用 KILL
语句来杀死线程。processlist_id
线程 processlist 标识符可以通过 INFORMATION_SCHEMA
PROCESSLIST
表的 ID
列、SHOW PROCESSLIST
输出的 Id
列和性能模式 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
语句在不等待确认的情况下返回,但终止标志检查会在合理短的时间内中止操作。中止操作以执行任何必要的清理也需要一些时间。在
UPDATE
或DELETE
操作期间,会在每次读取数据块后以及每次更新或删除行后检查终止标志。如果设置了终止标志,则会中止语句。如果您没有使用事务,则不会回滚更改。GET_LOCK()
会中止并返回NULL
。如果线程位于表锁处理程序中(状态:
Locked
),则会快速中止表锁。如果线程在写入调用中等待可用磁盘空间,则会中止写入并显示 “磁盘已满” 错误消息。
EXPLAIN ANALYZE
会中止并打印第一行输出。
终止对 MyISAM
表执行的 REPAIR TABLE
或 OPTIMIZE TABLE
操作会导致表损坏且无法使用。对该表的任何读写操作都会失败,直到您再次优化或修复它(无中断)。