MySQL服务连接数突然暴增,登录服务查看大都是sleep进程,并且1分钟会启用一个新的连接,紧急处理方案是需要手动去释放连接数。
查看wait_timeout
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 7200 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'interactive_timeout';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| interactive_timeout | 7200 |
+---------------------+-------+
1 row in set (0.01 sec)
直接修改会发现 wait_timeout 不生效
mysql> set global wait_timeout=600;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 600 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> quit
mysql> show variables like "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 7200 |
+---------------+-------+
注:设置全局变量时,它只影响新建立的连接,已有连接保持其当前的会话级参数值
退出会话,重新连接,但发现session会话 wait_timeout
依旧没生效
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()). See also interactive_timeout.
wait_timeout
的会话初始值,根据mysql客户端的类型不同,而选择使用global wait_timeout
的值,或者使用global interactive_timeout
的值.
wait_timeout
: 适用于非交互式连接,如脚本或JDBC应用程序
interactive_timeout
: 适用于交互式连接,如MySQL命令行
这就可以理解这里为什么我们的会话级别的wait_timeout
的初始值,因为全局的interactive_timeout=7200
,而我们又是使用交互式客户端。
调整wait_timeout
避免继承机制造成混淆,同时设置wait_timeout
和 interactive_timeout
set global wait_timeout = 600;
set global interactive_timeout = 600;
mysql> set global wait_timeout = 600;
Query OK, 0 rows affected (0.00 sec)
mysql> set global interactive_timeout=600;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
$ mysql -S /tmp/mysql.sock
mysql> show variables like "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 600 |
+---------------+-------+
1 row in set (0.00 sec)
wait_timeout 参数
用于设定客户端与 MySQL的空闲连接(非交互)超过此设定时间后,MySQL会自动断开这个连接。默认时间一般为 28800 秒,即 8 小时。
为什么需要 wait_timeout 参数
在互联网应用中,大量的空闲连接是非常常见的。这些空闲连接往往出现在业务低峰期,或者是客户端的某些操作因为某些原因暂停了过长时间。长期的空闲连接会占用 MySQL的资源,影响其性能,甚至可能导致 MySQL 因为达到最大连接数而无法建立新的连接。