关于MySQL优化----wait_timeout和interactive_timeout的设置问题的疑惑
MySQL中的配置参数interactive_timeout和wait_timeout 
MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。我按照这个提示 操作如下
mysql> show variables like '%timeout%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| connect_timeout         | 10    |
| delayed_insert_timeout  | 300   |
| interactive_timeout     | 28800   |
| net_read_timeout        | 30    |
| net_write_timeout       | 60    |
| slave_net_timeout       | 3600  |
| table_lock_wait_timeout | 50    |
| wait_timeout            | 28800   |
+-------------------------+-------+
8 rows in set (0.00 sec)mysql> set global  wait_timeout=300 ,interactive_timeout=300;退出 重新登录。。mysql> show variables like '%timeout%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| connect_timeout         | 10    |
| delayed_insert_timeout  | 300   |
| interactive_timeout     | 300   |
| net_read_timeout        | 30    |
| net_write_timeout       | 60    |
| slave_net_timeout       | 3600  |
| table_lock_wait_timeout | 50    |
| wait_timeout            | 300   |
+-------------------------+-------+
8 rows in set (0.00 sec)之后我的疑惑: 为什么 show processlist 中 time 列还有超过300秒的sleep进程?????mysql> show processlist;
+----------+----------------+---------------------+----------+-------------+---------+----------------------------------------------------------------+------------------+
| Id       | User           | Host                | db       | Command     | Time    | State                                                          | Info             |
+----------+----------------+---------------------+----------+-------------+---------+----------------------------------------------------------------+------------------+
|        2 | aa             | 192.168.1.81:36831  | NULL     | Binlog Dump | 2362827 | Has sent all binlog to slave; waiting for binlog to be updated | NULL             
|  4868501 | aa             | 192.168.1.129:37854 | NULL     | Binlog Dump |  515107 | Has sent all binlog to slave; waiting for binlog to be updated | NULL             
| 12600468 | abc_admin      | 192.168.1.116:25271 | abc      | Sleep       |    7399 |                                                                | NULL             
| 12608033 | abc_admin      | 192.168.1.116:27573 | abc      | Sleep       |    7306 |                                                                | NULL             
| 12624454 | abc_admin      | 192.168.1.116:33785 | abc      | Sleep       |    6174 |                                                                | NULL             
| 12626744 | abc_admin      | 192.168.1.116:34358 | abc      | Sleep       |    6626 |                                                                | NULL             
| 12642032 | abc_admin      | 192.168.1.116:39647 | abc      | Sleep       |    6108 |                                                                | NULL             
| 12654395 | abc_admin      | 192.168.1.116:44124 | abc      | Sleep       |    3805 |                                                                | NULL             
| 12698547 | abc_admin      | 192.168.1.116:61930 | abc      | Sleep       |    3745 |                                                                | NULL            

解决方案 »

  1.   

    建议你再连一个进去,这个新的SESSION应该会在300秒后断开。
      

  2.   

    确实是变更之前的,set global wait_timeout=300 ,interactive_timeout=300; 设置多大比较合理?问题1:这里为什么要同时设置interactive_timeout,wait_timeout的设置才会生效?问题2:interactive的值如果设置的和wait_timeout不同,为什么Interactive_timeout会覆盖wait_timeout?问题3:在进行MySQL优化时,因为interactive_timeout决定的是交互连接的时间长短,而wait_timeout决定的是非交互连接的时间长短。如果在进行连接配置时mysql_real_connect()最后一个参数client_flag不设置为CLIENT_INTERACTIVE,是不是interactive_timeout的值不会覆盖wait_timeout?问题4:为了减少长连接的数量,在设置优化时是不是可以将interactive_timeout的值设置的大些,而wait_timeout的值设置的小些?但是问题2的描述好像又不允许这样不知道各位同学有没有研究过这个参数配置的,望不吝赐教~~~
      

  3.   

    On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()). 现在很多人使用连接池,所以这个参数保持默认值就可以了;您也可以用下面的工具杀死空闲连接!http://www.maatkit.org/doc/mk-kill.html#match_commandCheck for sleeping processes and kill them all every 10s:mk-kill --match-command Sleep --kill --no-only-oldest --interval 10