在 MySQL 中配置连接限制和超时设置
在 MySQL 中配置连接限制和超时设置,可以有效防止资源滥用、避免连接过多导致服务崩溃。下面从参数说明、配置方法、实时查询与调优建议四个方面,为你全面详解。
一、关键参数概览
| 参数名 | 默认值(MySQL 8.0) | 说明 |
|---|---|---|
max_connections | 151 | 最大允许同时连接数(包含系统线程) |
max_user_connections | 0 | 每个用户允许的最大连接数(0=无限) |
wait_timeout | 28800(8小时) | 非交互连接空闲多久后断开 |
interactive_timeout | 28800 | 交互式连接(如MySQL CLI)空闲多久后断开 |
connect_timeout | 10 | 客户端连接超时秒数 |
net_read_timeout | 30 | 客户端读取超时时间 |
net_write_timeout | 60 | 客户端写入超时时间 |
thread_cache_size | 9 | 空闲线程缓存数(避免频繁创建线程) |
📌 注:实际连接超时可能受客户端库(如 JDBC/PHP PDO)设置影响。
二、修改方法
1. 临时修改(立即生效、重启失效)
-- 最大连接数
SET GLOBAL max_connections = 300;
-- 每用户最大连接数
SET GLOBAL max_user_connections = 50;
-- 非交互连接超时时间(单位:秒)
SET GLOBAL wait_timeout = 600;
-- 交互连接超时时间(单位:秒)
SET GLOBAL interactive_timeout = 600;
-- 客户端连接超时时间
SET GLOBAL connect_timeout = 10;
查看当前值:
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'wait_timeout';
2. 永久修改(推荐,需重启 MySQL)
方法一:修改 my.cnf 配置文件
[mysqld]
max_connections = 300
max_user_connections = 50
wait_timeout = 600
interactive_timeout = 600
connect_timeout = 10
重启 MySQL:
sudo systemctl restart mysql
方法二:Docker 中设置
如果你用 Docker 运行 MySQL,可通过 command 覆盖:
services:
mysql:
image: mysql:8.0
command: [
"--max_connections=300",
"--wait_timeout=600"
]
三、实时监控连接数
-- 当前活跃连接数(含 sleep 连接)
SHOW STATUS LIKE 'Threads_connected';
-- 已创建的连接总数
SHOW STATUS LIKE 'Connections';
-- 检查连接来源(IP)
SELECT host, COUNT(*) FROM information_schema.processlist GROUP BY host;
四、调试与故障排查
| 问题 | 诊断方法 | 建议 |
|---|---|---|
Too many connections | 查看 SHOW STATUS LIKE 'Max_used_connections'; | 增大 max_connections 或优化连接池 |
| 连接长时间挂起 | SHOW PROCESSLIST | 识别慢 SQL,避免长事务 |
| 连接被自动断开 | 检查 wait_timeout 是否过低 | 设置合理 timeout 并调优客户端 |
| 应用频繁断连 | 检查 net_write_timeout, net_read_timeout | 调高为 60~120 秒 |
五、最佳实践建议
| 场景 | 建议设置 |
|---|---|
| Web 应用连接池(如 PHP、Node.js) | 使用 wait_timeout=60~120,避免长连接 idle |
| 数据导入或大事务执行 | 调高 net_write_timeout=180 |
| 多用户环境 | 设置 max_user_connections=50 限制滥用 |
| 高并发读取(只读从库) | 可适当提高 max_connections=500~1000 |
| 应用主动保持连接 | 使用 select 1 定时心跳保持连接 |
📚 官方参考文档
示例总结
-- 推荐设置(适合普通 Web 应用)
SET GLOBAL max_connections = 300;
SET GLOBAL max_user_connections = 50;
SET GLOBAL wait_timeout = 90;
SET GLOBAL interactive_timeout = 90;
SET GLOBAL connect_timeout = 10;
SET GLOBAL net_read_timeout = 30;
SET GLOBAL net_write_timeout = 60;
更多详细内容请关注其他相关文章!