MYSQL SHOW PROCESSLIST; , 判断sleep的进程状态

一、什么是 Sleep 状态?

当一个客户端(如应用程序、脚本、MySQL CLI)成功连接 MySQL 并执行完一条 SQL 后,尚未断开连接,此时连接就处于 Sleep 状态。

Id: 123
User: app_user
Host: 10.0.0.5:54321
db: wms
Command: Sleep
Time: 1800    -- 已空闲 1800 秒(30 分钟)
State:
Info: NULL

这表示:

    客户端已登录
    最近一次操作已完成
    连接保持打开,等待下一条命令


二、哪些 Sleep 是“正常且有用”的?
 1. 应用使用连接池(最常见)

现代应用(Java/Python/Go 等)通常使用连接池(如 HikariCP、Druid),会预先建立并保持若干连接,避免频繁创建/销毁连接的开销。

→ 这些连接大部分时间处于 Sleep,但随时可被复用,非常有用!


特别注意:如果连接在 Sleep 状态下持有未提交的事务,它可能:

    锁住表或行
    阻塞其他会话
    导致主从延迟(因 binlog 未 flush)

可通过以下命令检查:

SELECT * FROM information_schema.innodb_trx 
WHERE trx_mysql_thread_id IN (
    SELECT Id FROM information_schema.processlist WHERE Command = 'Sleep'
);


如何安全清理无用的 Sleep 连接?
 方法 1:设置超时自动断开(推荐!)

[mysqld]
wait_timeout = 300        # 非交互式连接空闲 300 秒后断开
interactive_timeout = 300 # 交互式连接(如 mysql CLI)同样限制

方法 2:手动 kill 长时间空闲连接

-- 查找空闲超过 1 小时的 Sleep 连接
SELECT Id, User, Host, db, Time 
FROM information_schema.processlist 
WHERE Command = 'Sleep' AND Time > 3600;

-- 杀掉(谨慎!确保不是重要应用)
KILL 12345;



白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论