更新时间:2026-07-03 GMT+08:00
分享

连接数满

场景描述

当数据库侧连接数打满时,会收到连接数满告警或客户端新建连接超时失败。

原因分析

表1 连接数满原因分析

原因

描述

影响

连接池未使用或配置不当

未使用连接池,直接创建和关闭数据库连接。

高并发下数据库连接数激增,资源耗尽,系统性能下降。

连接池最大连接数设置过高。

低负载时维持大量连接,浪费数据库资源,可能影响其他服务。

连接池最小空闲连接数过大。

低负载时维持大量空闲连接,增加数据库资源消耗。

未及时回收空闲连接(如未配置超时时间或回收策略)。

空闲连接累积,最终撑满数据库连接池,新请求无法获取连接。

业务突发流量

秒杀、大促等活动导致并发请求瞬间飙升,连接创建速度远超释放速度。

数据库连接数迅速耗尽,系统响应延迟甚至崩溃。

慢SQL与长事务

SQL执行时间过长,占用连接未及时释放。

连接池可用连接减少,迫使应用创建更多连接,加剧资源竞争。

事务未及时提交,长时间占用连接。

连接池可用连接减少,系统性能下降,可能引发死锁或超时。

连接泄漏

未正确关闭数据库连接。

连接池可用连接持续减少,最终导致连接资源耗尽,系统无法处理新请求。

预防措施

  • 合理设置如下参数:
    • max_user_connection:限制单个数据库用户的最大并发连接数。
    • max_connections:限制整个数据库实例允许建立的并发连接总数(包含所有用户)。
    • wait_timeout:控制客户端连接最大空闲时长。当非交互式客户端连接(例如通过应用程序代码进行连接)处于空闲(没有任何活动查询)且超过指定秒数后,数据库侧会主动断开该连接。
    • interactive_timeout:控制客户端连接最大空闲时长。当交互式客户端连接(例如通过MySQL 命令行工具(如 mysql -u root -p)进行连接)处于空闲(没有任何活动查询)且超过指定秒数后,数据库侧会主动断开该连接。
  • 设置告警规则为关键指标设置阈值告警。例如,当连接数超过最大连接数的80% 时触发告警,提醒及时介入。
  • 定期终止空闲会话和长会话。

优化建议

  • 业务侧开启并合理配置连接池。
  • 临时扩容数据库连接数

    突发流量或短时过载时,可以临时调大max_connections的值。例如当前最大连接数为6500,可以考虑扩大一倍,修改为max_connections=13000。仅作为临时缓解手段,且有触发OOM 的风险,因此业务恢复后需立即调回原值。调大之后也可能新建连接进来可能会继续打满,因此需同时对异常SQL进行限流。

  • SQL限流与异常SQL治理
    • 对异常SQL(如慢查询、长事务)实施限流,优先保障核心业务。使用TaurusDB的SQL限流功能设置阈值,限制高耗资源SQL的并发数。
    • 通过慢查询日志定位并优化高频慢SQL,减少单个请求的连接占用时间。
  • 若各类SQL数量过多,难以实现快速限流,可以选择如下方法恢复:
    • 主备倒换:当主节点的连接数打满,但是只读节点连接不高时,可以主备倒换快速恢复业务。
    • 重启只读节点:当某个只读连接数打满时,可以重启该只读节点,释放被占用的连接资源。
    • 重启实例:所有节点连接数均打满且无法通过其他手段恢复时,可选择重启实例。但是需谨慎操作,重启会导致短时服务中断,重启会导致Buffer Pool中的热数据被清空,建议在业务低峰期执行。

相关文档