一、什么是 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;
本文为宁若水!原创文章,转载无需和我联系,但请注明来自[若水]博客 www.lalaya.net
