mysql sleep 过多解决方法


mysql中运行 SHOW PROCESSLIST; 发现数据库中 很多 sleep 进程
造成sleep的原因 mysql手册 解释
1 客户端退出前没有调用mysql_close() ]
2 客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器
[ 常连 不完整的tcp ip协议构造 服务端一直认为客户端仍然存在(有可能客户端已经断掉了)]
3 客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了  [参看 tcp ip协议的三次握手]

解决的方法
在配置文件中加入
[mysqld]
wait_timeout=10
或者
mysql> set global wait_timeout=10;

睡眠连接过多 对mysql服务器 影响
消耗mysql服务器资源(cpu 内存) 可能导致mysql崩溃
造成睡眠连接过多的原因
1 用了太多持久连接 高并发系统中 不适合使用持久连接
2 程序没有及时关闭mysql连接
3 数据库查询优化不够 过度耗时

用shell脚本配合cron
定期杀死睡眠时间太久的连接
可能导致数据崩溃 实施成本较繁琐 不推荐

应让mysql自己决定这些睡眠连接的命运 实施会更简单 有效
mysql的配置文件
wait_timeout 即可设置睡眠连接超时秒数 如果某个连接超时 会被mysql自然终止 多好的办法!
wait_timeout=100 #即设置mysql连接睡眠时间为100秒
任何sleep连接睡眠时间若超过100秒
将会被mysql服务自然终止 要比编写shell脚本更简单
正在运行中的生产服务器
在不能停止服务情况下
以root用户登录到mysql
执行即可
set global wait_timeout=60