首页/数据/数据库速查/KILL 终止会话与语句

KILL 终止会话与语句

KILL QUERY 只结束当前语句、保留连接;KILL CONNECTION 断开整个会话。批量清理前先确认业务影响。

数据库速查数据更新于 2026-10-13

KILL 能做什么

KILL 用来干预异常会话:KILL QUERY 只结束当前正在执行的语句,连接本身保留;KILL CONNECTION 断开整个会话,事务一并回滚。不写修饰词时等价于 KILL CONNECTION。使用场景很具体:终止长事务、清理堆积的空闲连接、中止失控的批量更新,以及在锁等待排查中干掉阻塞源。

基本信息

语法KILL [CONNECTION | QUERY] 线程ID
默认行为不写修饰词时等价于 KILL CONNECTION
替代工具mysqladmin kill、pt-kill
权限杀其它账号的会话需要 PROCESS 或 CONNECTION_ADMIN
查看会话information_schema.PROCESSLIST 或 SHOW PROCESSLIST

典型使用场景

  • 终止执行时间异常长的查询或事务
  • 清理长时间处于 Sleep 的连接,处理连接池泄漏
  • 中止误执行的批量更新,避免影响面继续扩大
  • 配合锁等待排查,杀掉持锁不放的源头会话
  • 实例负载过高时作为应急保护手段

终止与确认

终止与确认
KILL QUERY 12345;      -- 只结束当前语句,连接保留
KILL CONNECTION 12345; -- 断开整个会话
KILL 12345;            -- 默认等价 CONNECTION

SELECT id, user, host, db, command, time, state, LEFT(info, 60) AS sql_head
FROM information_schema.PROCESSLIST
WHERE command='Sleep' AND time > 600 ORDER BY time DESC;

SELECT id, user, host, time, state
FROM information_schema.PROCESSLIST WHERE id = 12345;   -- 杀之前先确认

用法与约束

概念说明注意事项
KILL QUERY结束当前语句,连接保留事务尚未结束,其余语句仍可继续
KILL CONNECTION断开连接并回滚事务回滚耗时可能超过原语句
默认 KILL等价于 CONNECTION脚本里最好写全,避免歧义
权限要求需 PROCESS 或 CONNECTION_ADMIN普通账号只能杀自己的会话
Sleep 会话command 为 Sleep阈值按业务定,不要一刀切清理
终止大 UPDATE 或 DELETE 后,InnoDB 回滚已修改的行可能比原语句更慢,磁盘 IO 会持续很久。尽量在低峰执行,或用 pt-kill 按速率平滑清理。
KILL 是异步的:命令返回后会话不一定立刻消失,要用 SHOW PROCESSLIST 复查,确认线程真的不在了,再进行下一步操作。
批量清理空闲连接要控制速率并保留保护名单:一次性杀掉几百个连接,会让应用在同一时刻重连,把连接数推向新的峰值,反而比清理之前更糟。

易错点

  • KILL 之后不复查:命令返回就认为线程已消失,实际还在回滚
  • 杀其它账号的会话缺权限:报错后才去查权限,白白耽误处置时间
  • 用 KILL CONNECTION 处理慢查询:连接与事务一起丢,业务还要额外处理重连
  • 批量杀连接不限速:应用同时重连,形成新的连接风暴
  • 不做保护名单就批量清理 Sleep 会话:备份、监控、复制的长连接被误杀,链路直接中断

数据来源与参考

  • MySQL 8.0 Reference Manual: KILL Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌