MySQL配置wait_timeout浅析
Admin
2019-04-28 14:50:27
MySQL
在缺省情况下,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())。