当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL 8.4 连接池雪崩实战:Too many connections 不是把 max_connections 调大就完事

MySQL 8.4 连接池雪崩实战:Too many connections 不是把 max_connections 调大就完事

来源:17golang 原创 2026-06-05 10:23:34 0浏览 收藏

凌晨一点,业务报警不是慢查询,而是连接失败:ERROR 1040 (HY000): Too many connections。很多人第一反应是把 max_connections 从 800 调到 2000。我一般会先拦一下,因为这类事故最怕把保险丝换成铁丝。

MySQL 8.x 里,max_connections 决定普通客户端连接上限;到达上限后,新的普通连接会被拒绝。MySQL 8 也提供管理连接相关能力,方便在连接打满时保留排障入口。本文不讲客户端框架,只站在 MySQL 侧,把连接池雪崩怎么复现、怎么诊断、怎么上线收口讲清楚。

MySQL 连接池雪崩治理脑图
脑图:连接打满不是一个参数问题,而是连接池、慢 SQL、长事务和容量规划一起出问题。

先复现:为什么小流量也能打满连接

假设一个订单服务有 24 个副本,每个副本连接池最大 50,光这一个服务理论上就能占 1200 条连接。如果 MySQL 实例 max_connections=1000,再加上后台任务、报表、运维连接和复制连接,事故已经写在配置里了。

SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Connection_errors_max_connections';

这里要分清两个指标:Threads_connected 高,说明连接占用多;Threads_running 高,说明正在执行的线程多。如果 connected 高但 running 不高,常见原因是连接池开太大或连接泄漏。如果 running 也高,就要继续查慢 SQL、锁等待和长事务。

事故现场先保命:别把 DBA 挡在门外

连接打满时,最尴尬的是应用连不上,DBA 也连不上。MySQL 8 可以规划管理连接入口,生产上至少要有一条排障通道和一个不被业务连接池使用的管理账号。没有这条通道,现场只能等连接自然释放,或者冒险杀进程。

MySQL Too many connections 排障流程
流程图:先保留排障入口,再拆连接来源,最后决定调池还是调 MySQL。

定位来源:谁占住了连接

连接问题不要只看总数,要看账号、来源主机、状态和持续时间。下面这些 SQL 足够在现场先摸清方向。

SELECT user, host, db, command, time, state
FROM information_schema.processlist
ORDER BY time DESC
LIMIT 30;

SELECT user, host, current_connections, total_connections
FROM sys.user_summary_by_statement_latency
ORDER BY current_connections DESC
LIMIT 20;

如果大量连接处于 Sleep,先查连接池最小空闲、最大连接、空闲回收和泄漏。如果大量连接卡在同一种 state,比如 waiting for lock 或 sending data,就不要急着调连接数,先回到 SQL、索引和事务。

MySQL 连接池诊断 SQL 案例
案例图:现场先看 Threads、Max_used_connections 和 processlist,再判断是池太大还是 SQL 堵住。

连接池容量怎么估

我的经验是反过来算:先给 MySQL 实例留出管理、复制、定时任务和临时排障余量,再把剩余连接按服务重要性分配。不要让所有服务的连接池最大值简单相加后超过实例上限。

可分配业务连接 = max_connections - 管理余量 - 复制/任务余量
单服务池上限 = floor(服务连接预算 / 服务副本数)

例如 max_connections=1000,预留 100 给管理和后台,核心订单服务 30 个副本,如果给它 450 条预算,每个副本池上限就不应该超过 15。这个数字看着保守,但比 30 个副本各开 50 然后一起冲垮数据库可靠得多。

什么时候才调大 max_connections

只有在确认 CPU、内存、线程调度、SQL 延迟都能承受,并且连接数上限确实成为瓶颈时,我才会调大 max_connections。调之前要评估每条连接的内存开销、峰值并发 SQL、线程栈和临时内存风险。否则你只是允许更多请求进入数据库排队。

SET PERSIST max_connections = 1200;
SHOW VARIABLES LIKE 'max_connections';

生产上我更推荐先调连接池和超时:降低最大池、缩短空闲回收、设置合理连接获取超时,并在熔断侧限制重试风暴。MySQL 侧调大上限通常是配套动作,不是第一动作。

上线检查清单

  • 确认所有服务副本数和连接池最大值,算出理论最大连接总和。
  • 为 DBA、复制、备份、迁移任务预留连接,不要让业务池吃满。
  • 监控 Threads_connectedThreads_runningMax_used_connections 和连接错误计数。
  • 对连接获取失败设置退避,避免失败后立刻重试形成风暴。
  • 压测时同时观察 SQL 延迟、锁等待和活跃线程,不只看 QPS。
  • 如果调整 max_connections,同步评估内存和线程调度风险。

总结

Too many connections 不是一句“数据库连接数太小”就能解释。它经常是连接池配置、服务副本数、慢 SQL、长事务和重试策略叠在一起的结果。真正稳的处理方式是:先保住排障入口,再拆连接来源,最后让连接池预算和 MySQL 承载能力对齐。

如果你只把 max_connections 调大,短期可能不报警,长期会让更多请求挤进数据库,把慢 SQL 和锁等待放大。把连接当容量资源来治理,才是高并发 MySQL 系统该有的基本功。

版本声明
本文转载于:17golang 原创 如有侵犯,请联系study_golang@163.com删除
JDK 24/25 虚拟线程 pinning 排查:synchronized 还会把吞吐卡住吗JDK 24/25 虚拟线程 pinning 排查:synchronized 还会把吞吐卡住吗
上一篇
JDK 24/25 虚拟线程 pinning 排查:synchronized 还会把吞吐卡住吗
Spring Boot 3.5 结构化日志实战:别让 JSON 日志变成新的噪音
下一篇
Spring Boot 3.5 结构化日志实战:别让 JSON 日志变成新的噪音
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    173次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    102次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    31次使用
  • LangGPT提示词框架:结构化Prompt设计方法与开源工具指南
    LangGPT
    LangGPT是一种受编程语言启发的结构化提示词设计工具,提供双层框架、模块化模板及变量功能,帮助用户高效编写高质量Prompt。该项目已在GitHub免费开源,适用于内容创作、编程辅助等多场景。
    40次使用
  • ClickPrompt:AI提示词生成与优化工具,支持Stable Diffusion、ChatGPT及代码辅助
    ClickPrompt
    ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
    76次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码