max_connections 是 MySQL 最核心的连接管理参数,决定了服务器允许的最大 并发客户端连接数 。配置不当是导致 "Too many connections" 错误的直接原因。


一、核心作用与默认值

作用

  • 硬上限:同时建立的 TCP 连接数不能超过此值

  • 保护机制:防止服务器因连接爆炸而耗尽资源

默认值

  • MySQL 5.7 : 151

  • MySQL 8.0+ : 151

  • 实际可调范围: 1 到 100000

快速查看

SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';  -- 当前活跃连接数
SHOW STATUS LIKE 'Max_used_connections'; -- 历史最高连接数

二、配置方法

1. 永久配置(推荐)

编辑 my.cnfmy.ini

[mysqld]
# 根据硬件和业务需求设置
max_connections = 500

重启生效 :

sudo systemctl restart mysqld

2. 动态调整(临时)

-- 全局生效,无需重启,重启后失效
SET GLOBAL max_connections = 500;

三、资源配置陷阱(⚠️ 必读)

max_connections 不是越高越好 ,每个连接都会消耗系统资源:

内存消耗构成

  • 线程栈 :每个线程至少 thread_stack 内存(默认 256KB-1MB)

  • 缓冲区 :每个连接独占

    • sort_buffer_size(默认 256KB)

    • join_buffer_size(默认 256KB)

    • read_buffer_sizeread_rnd_buffer_size

  • 文件描述符 :每个连接占用 1 个,受 ulimit -n 限制

经验公式

最大连接数 ≈ (可用内存 * 0.8) / (单连接平均内存 * 1.5)

典型场景内存估算 :

max_connections

预计内存消耗

适用场景

100

~500MB

小型应用,个人项目

500

~2-3GB

中型 Web 服务

1000

~5-8GB

大型高并发业务

5000+

>20GB

需专用数据库服务器+优化


四、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:连接数飙升

排查步骤 :

  1. 应用层 :检查是否有连接泄漏(未关闭连接)

  2. 慢查询 :长时间运行的查询占用连接不释放

  3. 突发流量 :爬虫、攻击或业务异常峰值

问题 3:降低 max_connections 后无法重启

[ERROR] mysqld: Can't create a new thread (errno 11)

解决 :当前连接数 > 新配置值,需先手动 KILL 进程或调高 OS 的 ulimit


七、关联参数对比

参数

作用

推荐值

max_connections

服务器总连接上限

100-500(根据内存)

max_user_connections

单用户连接上限

50-100

max_connect_errors

连接失败阻塞阈值

100000(防误判)

back_log

TCP 连接队列长度

50-100

wait_timeout

空闲连接超时(秒)

600

interactive_timeout

交互式连接超时

600


八、配置示例

[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

关键行动

个人开发

50-100

无需调优

生产环境

200-500

必须配置连接池

高并发

500-1000+

OS 调优 + 监控 + 分库

核心记忆点max_connections 保护盾,不是性能银弹 。真正的解决方案是 连接池 + 合理的业务设计。