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表上执行后,会导致该表损坏且不可用。对这样的表进行读取或写入操作将失败,直到您再次优化或修复该表(无中断)。