在缺省情况下,wait_timeout的初始值是28800。
wait_timeout的值过大有弊端,其体现就是MySQL里有大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个值设置的过小,否则你可能会遭遇到“MySQL has gone away”之类的问题,通常来说,个人觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问题,比如说有一个CRON脚本,其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下, 以便服务器知道你还活着,重新计算wait_timeout时间):
# vi /etc/my.cnf
[mysqld]
wait_timeout=10
# /etc/init.d/mysql restart
这种方法太暴力了,线上数据库尽量还是不要重启,可以通过SET来设置:
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.01 sec)
mysql> set global wait_timeout=10;
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 10 |
+---------------+-------+
1 row in set (0.00 sec)
这里需要注意一点,当使用show variables like 'wait_timeout';查看时,会发现值并没有变化,那是因为使用show variables;查看的是当前会话的值(等同于show session variables;)
需要注意的是不要混淆了会话变量和全局变量,如果仅仅想修改会话变量的话,可以使用类似set wait_timeout=10;或者set session wait_timeout=10;。
另一个值得注意的是会话变量wait_timeout初始化的问题,在线程启动时,会话等待超时值是从全局等待超时值或全局交互超时值初始化的,具体取决于客户机的类型(由CLIENT_INTERACTIVE选项到mysql_real_connect())。