如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800。

wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQLhas goneaway”之类的问题,通常来说,我觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问题,比如说有一个CRON脚本,其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下,以便服务器知道你还活着,重新计算wait_timeout时间):

# vi /etc/my.cnf

[mysqld]

wait_timeout=10

# /etc/init.d/mysql restart

不过这个方法太生硬了,线上服务重启无论如何都应该尽可能避免,看看如何在MySQL命令行里通过SET来设置:

mysql> set global wait_timeout=10;

mysql> show global variables like'wait_timeout';

+----------------------------+-------+

| Variable_name            | Value |

+----------------------------+-------+

| wait_timeout             | 10   |

+----------------------------+-------+

这里一个容易把人搞蒙的地方是如果查询时使用的是showvariables的话,会发现设置好像并没有生效,这是因为单纯使用show variables的话就等同于使用的是showsession variables,查询的是会话变量,只有使用show globalvariables,查询的才是全局变量。

网络上很多人都抱怨说他们set global之后使用showvariables查询没有发现改变,原因就在于混淆了会话变量和全局变量,如果仅仅想修改会话变量的话,可以使用类似setwait_timeout=10;或者set session wait_timeout=10;这样的语法。

另一个值得注意的是会话变量wait_timeout初始化的问题,这一点在手册里已经明确指出了,我就直接拷贝了:

On thread startup, the session wait_timeout value isinitialized from the global wait_timeout value or from the globalinteractive_timeout value, depending on the type of client (asdefined by the CLIENT_INTERACTIVE connect option tomysql_real_connect()).

MySQL大拿Jeremy Zawodny曾在他的文章Fixing Poor MySQL DefaultConfigurationValues里面列出了几个很恶心的MySQL缺省设置,不过没包含wait_timeout,但我觉得它也应该算一个,每次新装MySQL后最好都记得修改它。

参考文章2

睡眠连接过多,会对mysql服务器造成什么影响?

严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。

造成睡眠连接过多的原因?

1. 使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)

2. 程序中,没有及时关闭mysql连接

3. 数据库查询不够优化,过度耗时。

那么,如果要从根本上解决sleep连接过多,就得从以上三点反复检查,但是见效并不快。

网上有人分享,使用shell脚本配合cron,定期杀死睡眠时间太久的连接,但是这种方法非常不可取,典型的以暴制暴,很可能导致数据崩溃,而且,还需要编写相应shell,设置cron, 实施成本较繁琐,不推荐使用。

那么更好的办法应该是让mysql自己决定这些睡眠连接的命运,实施会更简单,有效。

mysql的配置文件中,有一项:

wait_timeout, 即可设置睡眠连接超时秒数,如果某个连接超时,会被mysql自然终止,多好的办法!

如设置: 

wait_timeout=100#即设置mysql连接睡眠时间为100秒,任何sleep连接睡眠时间若超过100秒,将会被mysql服务自然终止,要比编写shell脚本更简单。

那么,对于正在运行中的生产服务器,在不能停止服务情况下,修改此项怎么办?很简单,以root用户登录到mysql,执行:

set global wait_timeout=100

即可。

在我的生产环境中,使用这个办法,取得了相当好的效果。

当然,更根本的方法,还是从以上三点排查之:

1. 程序中,不使用持久链接,即使用mysql_connect而不是pconnect。

2.   程序执行完毕,应该显式调用mysql_close

3. 只能逐步分析系统的SQL查询,找到查询过慢的SQL,优化之

PS: wait_timeout  设置为大于数据池执行心跳探雷的时间

最新文章

  1. socket通信
  2. customErrors与错误页面
  3. 《HP大规模敏捷开发实践》读书笔记
  4. socket.io,环境搭建 & Hello world
  5. 【bzoj3218】 a + b Problem
  6. Codeforces Round #218 (Div. 2) B. Fox Dividing Cheese
  7. php处理字符串常用函数
  8. windows 文件名太长无法删除的解决方法
  9. Python中函数参数传递问题
  10. Linux网络基础配置
  11. Web API-路由(二)
  12. for in 的各种坑
  13. Javascript百学不厌-递归
  14. JAVA中静态修饰符static的学习(初学)
  15. U盘安装CentOS 7问题解决
  16. sql语句——根据身份证号判断男女
  17. BaseEntity
  18. DB2修改自增主键起始值
  19. DOS命令下映射虚拟磁盘(驱动器)
  20. ssm的web项目,浏览器使用get方法传递中文参数时,出现乱码

热门文章

  1. centos 6.4 调整home和root分区大小
  2. maven 亲测可用国内镜像 阿里云(20170123)
  3. Oracle用同义词可以不使用用户名.表名查询表 Oracle 创建synonym
  4. js Circle类
  5. 超酷的Android 侧滑(双向滑动菜单)效果
  6. 百度UEditor富文本编辑器去除过滤div等标签
  7. javaBean与map类型相互转换
  8. python学习笔记——多进程二 进程的退出
  9. RMAN - 发现I/O瓶颈
  10. view变化监听器ViewTreeObserver介绍