max_connections 是 MySQL 最核心的连接管理参数,决定了服务器允许的最大 并发客户端连接数 。配置不当是导致 "Too many connections" 错误的直接原因。
一、核心作用与默认值
作用
硬上限:同时建立的 TCP 连接数不能超过此值
保护机制:防止服务器因连接爆炸而耗尽资源
默认值
MySQL 5.7 :
151MySQL 8.0+ :
151实际可调范围: 1 到 100000
快速查看
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected'; -- 当前活跃连接数
SHOW STATUS LIKE 'Max_used_connections'; -- 历史最高连接数二、配置方法
1. 永久配置(推荐)
编辑 my.cnf 或 my.ini:
[mysqld]
# 根据硬件和业务需求设置
max_connections = 500重启生效 :
sudo systemctl restart mysqld2. 动态调整(临时)
-- 全局生效,无需重启,重启后失效
SET GLOBAL max_connections = 500;三、资源配置陷阱(⚠️ 必读)
max_connections 不是越高越好 ,每个连接都会消耗系统资源:
内存消耗构成
线程栈 :每个线程至少
thread_stack内存(默认 256KB-1MB)缓冲区 :每个连接独占
sort_buffer_size(默认 256KB)join_buffer_size(默认 256KB)read_buffer_size、read_rnd_buffer_size等
文件描述符 :每个连接占用 1 个,受
ulimit -n限制
经验公式
最大连接数 ≈ (可用内存 * 0.8) / (单连接平均内存 * 1.5)
典型场景内存估算 :
四、OS 层限制检查
在调高 max_connections 前, 必须 先检查操作系统限制:
1. 文件描述符限制
# 查看当前用户限制
ulimit -n # 默认通常是 1024
# 查看 MySQL 进程实际限制
cat /proc/$(pgrep mysqld)/limits | grep "Max open files"2. 修改 OS 限制
# 编辑 /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
# 编辑 /etc/sysctl.conf
fs.file-max = 100000五、最佳实践(✅ 推荐)
1. 核心原则:连接复用 > 增加连接
不要用调高 max_connections 解决性能问题 ,而应使用 连接池 :
应用层 :HikariCP (Java)、SQLAlchemy (Python)、PDO (PHP)
中间件 :ProxySQL、MySQL Router
2. 合理设置建议
[mysqld]
# 根据业务峰值设置,预留 20% 缓冲
# 先观察 Max_used_connections 历史值
max_connections = 峰值连接数 * 1.2
# 限制单个用户最大连接(防止单应用耗尽)
max_user_connections = 100 # 可选3. 监控与告警
-- 设置告警阈值:当连接数 > 80% 时触发
Threads_connected / max_connections > 0.8六、常见问题处理
问题 1:"Too many connections"
-- 紧急处理:用管理员账户登录
mysql -u root -p --protocol=tcp
-- 查看谁在占用连接
SHOW PROCESSLIST;
-- 或
SELECT user, host, COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST GROUP BY user, host;问题 2:连接数飙升
排查步骤 :
应用层 :检查是否有连接泄漏(未关闭连接)
慢查询 :长时间运行的查询占用连接不释放
突发流量 :爬虫、攻击或业务异常峰值
问题 3:降低 max_connections 后无法重启
[ERROR] mysqld: Can't create a new thread (errno 11)
解决 :当前连接数 > 新配置值,需先手动 KILL 进程或调高 OS 的 ulimit。
七、关联参数对比
八、配置示例
[mysqld]
# 根据 8GB 内存服务器调整
max_connections = 300
# 配合连接内存参数优化
thread_cache_size = 50
sort_buffer_size = 128K # 降低单连接内存
join_buffer_size = 128K
# 超时设置,及时回收空闲连接
wait_timeout = 600
interactive_timeout = 600总结
核心记忆点:max_connections 是 保护盾,不是性能银弹 。真正的解决方案是 连接池 + 合理的业务设计。
评论