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 复查,确认线程真的不在了,再进行下一步操作。
批量清理空闲连接要控制速率并保留保护名单:一次性杀掉几百个连接,会让应用在同一时刻重连,把连接数推向新的峰值,反而比清理之前更糟。