文档首页
MySQL 8.4 参考手册
相关文档 下载本手册

15.7.8.4 KILL 语句

KILL [CONNECTION | QUERY] processlist_id

每个与 mysqld 的连接都在一个单独的线程中运行。您可以使用 KILL processlist_id 语句终止线程。

线程进程列表标识符可以从 INFORMATION_SCHEMA PROCESSLIST 表的 ID 列、SHOW PROCESSLIST 输出的 Id 列和性能模式 threads 表的 PROCESSLIST_ID 列中确定。当前线程的值由 CONNECTION_ID() 函数返回。

KILL 允许使用可选的 CONNECTIONQUERY 修饰符

  • KILL CONNECTION 与不带修饰符的 KILL 相同:它会在终止连接正在执行的任何语句后,终止与给定 processlist_id 关联的连接。

  • KILL QUERY 会终止连接当前正在执行的语句,但连接本身保持不变。

查看哪些线程可以被杀死的能力取决于 PROCESS 权限。

  • 如果没有 PROCESS 权限,您只能看到您自己的线程。

  • 如果拥有 PROCESS 权限,您就可以看到所有线程。

杀死线程和语句的能力取决于 CONNECTION_ADMIN 权限和已弃用的 SUPER 权限。

您还可以使用 mysqladmin processlistmysqladmin kill 命令来检查和杀死线程。

当您使用 KILL 时,会为该线程设置一个特定于线程的终止标记。在大多数情况下,线程可能需要一段时间才能终止,因为只在特定时间间隔检查终止标记。

  • SELECT 操作期间,对于 ORDER BYGROUP BY 循环,会在读取一个数据块后检查该标记。如果设置了终止标记,则语句将中止。

  • ALTER TABLE 操作会创建表副本,并定期检查从原始表读取的每几行复制行中的终止标记。如果设置了终止标记,则语句将中止,并且临时表将被删除。

    KILL 语句会在不等待确认的情况下返回,但终止标记检查会在相当短的时间内中止操作。中止操作以执行任何必要的清理也需要一些时间。

  • UPDATEDELETE 操作期间,会在读取每个块之后以及更新或删除每行之后检查终止标记。如果设置了终止标记,则语句将中止。如果您没有使用事务,则更改不会回滚。

  • GET_LOCK() 会中止并返回 NULL

  • 如果线程在表锁处理程序中(状态:Locked),则表锁将很快被中止。

  • 如果线程在写调用中等待空闲磁盘空间,则写操作将中止,并显示“磁盘已满”错误消息。

  • EXPLAIN ANALYZE 会中止并打印第一行输出。

警告

MyISAM 表上终止 REPAIR TABLEOPTIMIZE TABLE 操作会导致表损坏且无法使用。对该表的任何读取或写入操作都将失败,直到您再次优化或修复它(不中断)。