MySQL连接数暴增,wait_timeout 调整

2025-07-01 16 0

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_timeoutinteractive_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 因为达到最大连接数而无法建立新的连接。

相关文章

MySQL 备份库文件 恢复指定表 UPDATE或INSERT
kube-prometheus监控MySQL
Rocky9 Kubernetes MySQL5.7 启动报错解决
MySQL 添加字段锁表 事务导致的锁表记录
MySQL 千万级大表添加字段 pt-online-schema-change使用

发布评论