Documentation Home

13.7.6.4 KILL 语句

KILL [CONNECTION | QUERY] processlist_id

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

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

KILL允许可选 CONNECTIONQUERY 修饰符:

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

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

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

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

  • 使用PROCESS,您可以看到所有线程。

杀死线程和语句的能力取决于 SUPER权限:

  • 没有SUPER,您只能终止自己的线程和语句。

  • 使用SUPER,您可以终止所有线程和语句。

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

笔记

您不能使用KILL嵌入式 MySQL 服务器库,因为嵌入式服务器仅在主机应用程序的线程内运行。它不会创建自己的任何连接线程。

当您使用 时KILL,会为线程设置特定于线程的终止标志。在大多数情况下,线程可能需要一些时间才能结束,因为 kill 标志仅在特定时间间隔检查:

  • SELECTfor ORDER BYGROUP BY 循环操作期间,在读取一个行块后检查标志。如果设置了 kill 标志,语句将中止。

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

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

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

  • GET_LOCK()中止并返回 NULL

  • INSERT DELAYED线程快速刷新(插入)它在内存中的所有行,然后终止 。

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

  • 如果线程正在等待写入调用中的可用磁盘空间,写入将中止并显示磁盘已满 错误消息。

警告

终止表上的REPAIR TABLEor OPTIMIZE TABLE操作 MyISAM会导致表损坏且无法使用。在您再次优化或修复它(不中断)之前,对此类表的任何读取或写入都会失败。