15.7.8.4 杀死语句
KILL [CONNECTION | QUERY] processlist_id
每个连接到mysqld的线程都运行在单独的线程中。您可以使用KILL 语句杀死一个线程。processlist_id
线程进程列表标识符可以从INFORMATION_ SCHEMA中的PROCESSLIST表的ID列、SHOW PROCESSLIST输出的Id列和性能chema中的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时,会为该线程设置一个线程特定的杀死标记。在大多数情况下,这可能需要一些时间,因为只有在特定间隔检查kill标记:
-
在
SELECT操作中,对于ORDER BY和GROUP BY循环,标记将在读取行块后检查。如果kill标记已设置,语句将被中止。 -
ALTER TABLE操作在从原始表中读取每少量行时,周期性地检查kill标志。如果kill标志已设置,语句将被中止,并删除临时表。KILL语句立即返回,而kill标志检查将在较短时间内中止操作。中止操作以执行必要的清理也需要一些时间。 -
在
UPDATE或DELETE操作中,kill标志在每个块读取后和每个更新或删除行后被检查。如果kill标志已设置,语句将被中止。如果您不使用事务,变化不会回滚。 -
GET_LOCK()将中止并返回NULL。 -
如果线程处于表锁定处理状态(状态:
Locked),则表锁将快速中止。 -
如果线程等待写入调用中的免费磁盘空间,写入将以““disk full””错误消息被中止。
-
EXPLAIN ANALYZE将中止并打印输出的第一行。
对REPAIR TABLE或OPTIMIZE TABLE操作在MyISAM表上执行后,会导致该表损坏且不可用。对这样的表进行读取或写入操作将失败,直到您再次优化或修复该表(无中断)。