RDS for MySQL 连接数打满排查清单:先止血,再找漏连接的源头

举报
yd_293948692 发表于 2026/10/27 09:17:48 2026/10/27
【摘要】 新连接报 Too many connections 时,先用 CES 曲线与 Threads_connected 确认是否真的打满,再少量 KILL 长 Sleep 会话止血,最后按连接池、短连接、慢查询、共用账号、连接方式五条找漏连接的源头,并用 CES 告警兜底。

一、问题现象:先确认是“打满”,不是“连不上”

新连接报错 Too many connections,或应用间歇性连接超时,而已有连接仍能跑查询。先把概念对齐:华为云官方文档明确指出,数据库连接数表示应用程序可以同时连接到数据库的数量,与应用程序或者网站能够支持的最大用户数没有关系。一个用户请求可能复用连接池里的一个连接,一个后台任务也可能一次占多个连接,所以“用户不多”不等于“连接不多”。

连接数打满的代价不止业务报错:官方文档同时提醒,连接数过多可能导致业务侧无法正常连接,也会导致实例全量备份和增量备份失败。也就是说,这不是一个可以拖到第二天再看的问题。

二、前提条件

本文面向 RDS for MySQL。操作前确认三点:第一,你有实例的管理员账号或控制台操作权限,能够查看连接与参数;第二,区分两种形态:瞬间打满(某个发布、活动或任务后陡增)和缓慢爬升(每天涨一点,几天后触顶),两者的根因方向完全不同;第三,止血操作先在业务低峰或经业务方确认后做,KILL 会话是有副作用的。

三、分步操作

第 1 步:确认是不是真的打满

不要只凭报错下结论。用两组数据互相印证:

  1. 控制台云监控(CES)里看实例的连接数曲线:是陡增还是爬升,打满发生在哪个时间点,是否和发布、定时任务、活动时间重合。官方文档提到,云监控服务目前可以监控数据库 CPU、内存、磁盘、连接数等指标,并且设置告警策略,出现告警时可以提前识别风险——这次修好后,告警要顺手补上。
  2. 以管理员账号连上实例执行:
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';

当前连接数接近上限,才算“打满”;如果当前连接数离上限还远,报错可能来自单个账号的 max_user_connections 限制、网络或白名单,要换方向查。

第 2 步:止血——先恢复业务,再找根因

执行:

SHOW FULL PROCESSLIST;

按 User、Host、Time、State 分组看:谁占得多、谁 Sleep 得久、谁卡在 Sending data 或 Locked。

止血手段按风险从低到高:

  1. 先停掉可确认的异常来源,例如跑死循环的临时脚本、重复拉起的定时任务。
  2. 对确认无用且 Sleep 时间很长的会话执行 KILL <id>,一次杀少量,边杀边看 Threads_connected 是否回落。不要批量清空全部会话,生产关键会话被误杀会扩大故障。
  3. 临时放宽上限只能争取时间:RDS 对最大连接数未做硬性限制,MySQL 的 max_connections 与 max_user_connections 可在参数模板自定义。调大之前先想清楚:连接数涨上去,内存与线程开销也跟着涨,规格偏小的话官方建议是对数据库进行规格扩容,而不是无限调大上限。

第 3 步:找漏连接的源头

打满很少是“业务突然变大了”,多半是连接在某个环节漏了。按这个顺序排查:

  1. 连接池配置:应用连接池的最大连接数、最小空闲、空闲回收时间、获取连接超时是否合理;多副本部署时,总连接数等于单副本池大小乘以副本数,很容易在扩容后翻倍。
  2. 短连接高频建连:每次请求都新建连接、用完不复用,QPS 一涨就把连接数顶上去。改成长连接加连接池是正解。
  3. 慢查询占着连接:一个跑几十秒的 SQL 会把连接钉住,后面的请求只能新开连接。按官方给出的方向优化慢查询;另外官方还提到可通过控制台设置 innodb_adaptive_hash_index=off 关闭自适应哈希索引以减少锁等待,这类参数调整要先在测试环境验证,不要直接当止血药。
  4. 同一账号被多服务共用:多个服务、多个任务共用一个数据库账号时,单个账号的连接数限制会先被触发。分账号、分权限,既能定位,也能隔离风险。
  5. 连接方式:官方建议通过内网连接数据库实例,用内网连接不会出现因为带宽等原因的拥塞。公网连接除了拥塞风险,还容易受网络抖动影响导致连接挂起不释放。

第 4 步:验证

止血后依次验证:第一,Threads_connected 回落到日常水位;第二,业务新连接成功,报错消失;第三,CES 曲线在下一个业务高峰不再触顶;第四,确认当晚的全量或增量备份恢复正常——打满期间备份可能已经失败过一次,不要默认它自己好了。

四、常见坑

  1. 把连接数当成用户数:用户量没涨也可能打满,扩容应用副本反而会让连接数涨得更快。
  2. 只调大上限不修漏:上限调大后问题消失几天又复发,因为漏连接的速度没变。
  3. 批量 KILL:把正常业务会话一起清掉,故障从“新连接失败”变成“所有连接中断”。
  4. 忽略备份:只盯着业务报错,没发现备份已经连续失败,数据恢复窗口在悄悄变小。
  5. 参数改完不验证:改完 max_connections 或其他参数后没有复核生效情况与曲线,等于没改。

五、小结清单

  • 确认:CES 曲线 + Threads_connected + max_connections,三方印证再定性。
  • 止血:停异常来源,少量 KILL 长 Sleep 会话,临时放宽上限只争取时间。
  • 找漏:连接池、短连接、慢查询、共用账号、连接方式,五条逐一过。
  • 验证:连接数回落、新连接成功、高峰不触顶、备份恢复正常。
  • 兜底:CES 连接数告警设好,阈值留提前量,不要等打满才发现。

参考出处

本文涉及的产品行为以华为云官方文档为准:华为云帮助中心《RDS数据库连接数满的排查思路》,网址 https://support.huaweicloud.com/rds-mysql_faq/rds_faq_0019.html ;同一帮助中心《RDS数据库实例支持的最大数据连接数是多少》中对 max_connections、max_user_connections 的说明。文中未引用任何实测数据,具体以控制台与当前文档版本为准。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。