文档主页
MySQL 9.0 参考手册
相关文档 下载本手册

15.7.8.4 KILL 语句

KILL [CONNECTION | QUERY] processlist_id

每个到 mysqld 的连接都在一个单独的线程中运行。您可以使用 KILL processlist_id 语句来杀死线程。

线程 processlist 标识符可以通过 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 操作会导致表损坏且无法使用。对该表的任何读写操作都会失败,直到您再次优化或修复它(无中断)。