在 MySQL 中配置连接限制和超时设置
                           
天天向上
发布: 2025-07-06 14:48:08

原创
566 人浏览过

在 MySQL 中配置连接限制和超时设置,可以有效防止资源滥用、避免连接过多导致服务崩溃。下面从参数说明、配置方法、实时查询与调优建议四个方面,为你全面详解。


一、关键参数概览

参数名默认值(MySQL 8.0)说明
max_connections151最大允许同时连接数(包含系统线程)
max_user_connections0每个用户允许的最大连接数(0=无限)
wait_timeout28800(8小时)非交互连接空闲多久后断开
interactive_timeout28800交互式连接(如MySQL CLI)空闲多久后断开
connect_timeout10客户端连接超时秒数
net_read_timeout30客户端读取超时时间
net_write_timeout60客户端写入超时时间
thread_cache_size9空闲线程缓存数(避免频繁创建线程)

📌 注:实际连接超时可能受客户端库(如 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;

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *