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