<p>应使用SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 60筛选慢查询,而非仅依赖SHOW PROCESSLIST;MySQL 5.7.6+需区分KILL CONNECTION(断连回滚)与KILL QUERY(仅停语句),并确保具备SUPER或CONNECTION_ADMIN权限。</p>

怎么查出正在跑的慢查询?
别只用 SHOW PROCESSLIST —— 它默认只显示前100字符的 Info,且不带执行时长过滤。真正有用的命令是:
-
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 60;(筛选运行超60秒的查询) -
SELECT ID, USER, HOST, DB, TIME, STATE, LEFT(INFO, 120) AS INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND TIME > 30 ORDER BY TIME DESC;(更清晰的字段+截断SQL避免撑爆终端)
注意:TIME 列单位是秒,表示该线程处于当前状态的时间,不是SQL总耗时;STATE 为 Sending data、Copying to tmp table 或 Waiting for table metadata lock 时,大概率已卡住。
为什么 KILL 1234 有时没用?
MySQL 5.7.6+ 支持两种终止粒度,混淆使用会导致连接没断但查询还在跑,或连接被意外干掉:
-
KILL 1234等价于KILL CONNECTION 1234:直接断开整个连接,会回滚未提交事务 -
KILL QUERY 1234:只终止该连接当前正在执行的语句,连接保持活跃(适合不想中断应用连接池的场景)
如果执行 KILL 1234 后 SHOW PROCESSLIST 里仍看到同一 ID,说明它已被重用(MySQL会复用连接ID),实际进程早已结束——此时应查新ID,而非反复KILL旧号。
权限不够时怎么办?
KILL 需要 SUPER 权限(MySQL 8.0+ 可细化为 CONNECTION_ADMIN 或 SYSTEM_VARIABLES_ADMIN)。普通用户常遇到:
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or CONNECTION_ADMIN privilege(s) for this operation- 即使有
PROCESS权限能看列表,也不代表能杀
临时解决办法(仅限你有 root 或高权限账号):
- 用高权限账号登录后执行
KILL - 给目标用户授予权限:
GRANT CONNECTION_ADMIN ON *.* TO 'user'@'host'; FLUSH PRIVILEGES;
切勿在生产环境随意授予 SUPER,它可绕过几乎所有安全限制。
终止后客户端报什么错?
被KILL的查询在客户端通常不会静默失败,而是抛出明确异常:
- Java JDBC:
java.sql.SQLException: Query execution was interrupted - Python MySQLdb/PyMySQL:
OperationalError(1317, 'Query execution was interrupted') - Node.js mysql2:
Error: Query inactivity timeout或QueryInterruptedError
这些错误必须在应用层捕获并重试/降级,否则可能引发上游超时雪崩。另外,KILL 不保证立即生效——尤其对持有锁或写入磁盘的查询,可能需数秒才真正释放资源。
最易被忽略的是:KILL 只解决“当前”查询,不解决根源。查完、杀完,立刻去查 slow_query_log 或用 pt-query-digest 分析历史慢SQL,否则一小时后同样的查询又会卡住。


















