max_connections应据真实峰值设,如峰值800则设1000(留20%余量),小内存机≤500,16gb可设2000但须同步调大ulimit和somaxconn;wait_timeout与interactive_timeout均设300秒防僵尸连接,skip_name_resolve必须开启。

max_connections设多少才不翻车
连接数不是越高越好,设高了反而容易触发 Cannot allocate memory 或被系统 OOM killer 杀掉进程。关键看业务真实并发连接峰值,而不是“怕不够用”就拍脑袋设 5000。
实操建议:
- 先查历史峰值:
SHOW GLOBAL STATUS LIKE 'Threads_connected';配合慢日志和监控(如 Prometheus + mysqld_exporter)看 15 分钟内最大值 - 生产环境建议留 20% 余量:比如峰值是 800,
max_connections设 1000 即可 - 小内存机器(≤4GB)慎设超过 500;16GB 服务器可设到 2000,但必须同步调大
open_files_limit(至少是连接数的 2 倍) - 别忘了操作系统限制:
ulimit -n要 ≥open_files_limit,否则 MySQL 启动时会静默降级
wait_timeout 和 interactive_timeout 必须配对改
这两个参数控制空闲连接存活时间,设得太大(比如默认 28800 秒 / 8 小时)会导致大量“僵尸连接”堆积,占着 max_connections 名额却不干活,新连接直接被拒。
常见错误现象:Too many connections 报错,但 SHOW PROCESSLIST 里全是 Sleep 状态、Command 列为 Sleep、Time 列几百上千秒。
实操建议:
- Web 应用场景(PHP/Python/Java 连接池模式):设为
300(5 分钟)足够,连接池本身会保活 - DBA 手动连接或脚本直连:可设为
28800,避免反复输密码 -
wait_timeout和interactive_timeout值必须一致,否则应用行为不可预测(比如某些 JDBC 驱动会按其中较小值判断超时)
skip_name_resolve 关乎连接建立速度
MySQL 默认开启 DNS 反查,每个新连接都会尝试解析客户端 IP 对应的 hostname。一旦 DNS 服务延迟或不可达,连接就会卡在 Connecting to localhost... 状态几秒甚至十几秒。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
这个参数只影响连接建立阶段,不影响已建立连接的查询性能,但它是“首因问题”——很多“MySQL 慢”的排查最后都落在它身上。
实操建议:
- 务必设为
skip_name_resolve = ON(或1),这是所有生产环境的底线配置 - 设完后,
GRANT语句里的HOST必须用 IP 或'%',不能再用域名(比如'app-server.example.com') - 验证是否生效:
SELECT @@skip_name_resolve;返回1即成功
back_log 不是越大越好,但太小会丢连接
back_log 是 TCP 连接请求队列长度,不是 MySQL 内部连接数。当瞬间大量连接涌来(比如服务刚重启、压测开始),Linux 内核会先把 SYN 请求放这里排队;如果队列满,后续 SYN 直接被丢弃,客户端看到的是“Connection refused”而非“Too many connections”。
它和系统 net.core.somaxconn 有关联,MySQL 启动时取二者最小值作为实际生效值。
实操建议:
- 默认值
50完全不够用,尤其在容器或云环境(如 Docker Compose 启动多个应用实例) - 设为
back_log = 1024是较稳妥的选择,配合系统级调整:sysctl -w net.core.somaxconn=2048 - 不需要为低流量业务刻意调高,但上线前务必检查:用
ss -lnt | grep :3306看Recv-Q是否长期非零,若持续 >0 就说明队列在积压
max_connections 这种显眼参数,而是 skip_name_resolve 这种一开就见效、不开就默默拖慢每条连接建立的开关。还有就是 back_log 和系统 somaxconn 的配合,很多人只改 MySQL 配置却忘了调内核参数,结果白忙一场。










