KILL [CONNECTION | QUERY] processlist_id
每个与 mysqld 的连接都在一个单独的线程中运行。您可以使用 KILL
语句终止线程。processlist_id
线程进程列表标识符可以从 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
操作会导致表损坏且无法使用。对该表的任何读取或写入操作都将失败,直到您再次优化或修复它(不中断)。