
# RDS for MySQL连接数过载定位及处理建议
#### 场景介绍
连接数过载主要体现以下两个场景：
- 场景一：连接数持续缓慢上涨导致达到上限。
- 场景二：连接数瞬间飙升导致连接池耗尽。
 
#### 可能原因
**场景一（连接数持续缓慢上涨导致达到上限）主要包含以下原因：**
- **应用程序连接池配置不当导致连接泄漏**
  - 通过华为云控制台的监控指标查看连接数 登录华为云控制台，单击实例名称，进入实例概览页面，在左侧导航栏选择"监控与运维 \> 实时监控"，查看"当前活跃连接数"和"总连接数"指标，可切换查看实时数据或历史趋势图。
    
  
  - 通过SQL命令查询连接情况
    ```
    ```plaintext
    show status like 'Threads_connected';
    show variables like 'max_connections';
    ```
    ```
    
  
  - 通过华为云控制台的[实时会话](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0026.html)功能查看连接来源
    登录华为云控制台，单击实例名称，进入实例概览页面，在左侧导航栏选择"智能DBA助手 \> 实时会话"，查看所有会话信息，包括客户端IP地址，可按IP进行筛选和统计。
    可以排查客户端连接池配置，确保连接能够正常释放和复用。
    
   

- **空闲连接未及时释放导致连接堆积**
  - 通过华为云控制台的[实时会话](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0026.html)功能查看空闲连接
    登录华为云控制台，单击实例名称，进入实例概览页面，在左侧导航栏选择"智能DBA助手 \> 实时会话"，在会话列表可通过"Command"列筛选"Sleep"状态的空闲连接，并通过"Time"列查看空闲时间。
    
  
  - 通过SQL命令查询空闲连接
    ```
    ```plaintext
    select * from information_schema.processlist where command = 'Sleep' and time > 60;
    ```
    ```
    
  
  - 通过参数设置空闲超时时间 支持通过参数模板设置"wait_timeout"和"interactive_timeout"参数，默认值为28800秒（8小时），建议根据业务需求设置合理的空闲超时时间（如600秒\~1800秒）。同时，客户端连接池也需要配置合理的空闲连接回收参数，如Druid连接池的"minEvictableIdleTimeMillis"和"maxEvictableIdleTimeMillis"参数。更多操作，详见[修改RDS for MySQL实例参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)。
    
   

- **长事务未提交导致连接被占用**
  - 通过华为云控制台的[实时会话](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0026.html)功能查看长事务
    登录华为云控制台，单击实例名称，进入实例概览页面，在左侧导航栏选择"智能DBA助手 \> 实时会话"，查看执行时间较长的会话，可结合SQL文本判断是否为长事务。
    
  
  - 通过SQL命令查询长事务
    ```
    ```plaintext
    select * from information_schema.innodb_trx order by trx_started;
    ```
    ```
    可以通过优化事务逻辑、设置事务超时、避免在事务中执行耗时操作来减少长事务。
    
   
**场景二（连接数瞬间飙升导致连接池耗尽）主要包含以下原因：**
- **应用程序连接风暴导致瞬间大量连接请求**
  常见连接风暴场景：
  - 类型一：应用启动时初始化大量连接
  
  - 类型二：流量突增导致连接池快速扩容
  
  - 类型三：连接池配置的maxTotal过大，超过实例最大连接数限制
  
  - 类型四：应用程序异常重试导致连接数暴涨
  
  
  华为云RDS for MySQL支持配置"连接数使用率"监控告警功能，配置监控告警后连接数使用率到达阈值时可收到通知，详见[设置告警规则](https://support.huaweicloud.com/usermanual-rds-mysql/rds_06_0002.html)。
  
- **数据库响应慢导致连接排队堆积**
  当数据库出现以下情况时，会导致连接处理变慢进而堆积：
  - 慢SQL阻塞连接：可通过智能DBA助手的慢SQL分析功能定位，详见[查看实例慢SQL](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0030.html)。
  
  - 锁等待导致连接挂起：可通过智能DBA助手的锁等待分析功能定位，详见[管理锁\&事务](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0029.html)。
  
  - IO瓶颈导致响应延迟：可通过实时监控查看IO指标，详见[查看监控指标](https://support.huaweicloud.com/usermanual-rds-mysql/rds_06_0003.html)。
   
 
#### 对业务的影响
连接数过载会导致新连接无法建立，应用报"Too many connections"错误，严重时会导致服务完全不可用。
#### 处理建议
- **出现过载异常前的建议：**
  - 合理[配置应用连接池参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)，建议设置连接池最大连接数不超过实例最大连接数的70%\~80%，并配置合理的连接超时时间和空闲连接回收时间。
  
  - 通过华为云控制台[配置连接数告警阈值](https://support.huaweicloud.com/usermanual-rds-mysql/rds_06_0002.html)，建议设置为实例最大连接数的70%\~80%，当连接数超过阈值时及时收到告警通知。
  
  - 定期检查应用是否存在连接泄漏，确保连接使用后正确关闭。
  
  - 使用华为云RDS for MySQL的参数模板功能，统一管理数据库参数，[设置合理的wait_timeout参数值](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)（建议600秒\~1800秒）。
  
  - 确保客户端连接池配置的空闲超时时间小于数据库的wait_timeout参数值，避免连接池中的连接被数据库断开后产生无效连接。
   

- **过载异常中的建议：**
  - 通过华为云控制台的[实时会话](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0026.html)功能查看并Kill问题会话。
    登录华为云控制台，单击实例名称，进入实例概览页面，在左侧导航栏选择"智能DBA助手 \> 实时会话"，查看会话列表，选中空闲连接或问题会话，单击"Kill会话"按钮终止会话。支持批量Kill多个会话。
    
  
  - 通过华为云控制台的[SQL限流](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0033.html)功能限制问题SQL的并发执行。
    登录华为云控制台，单击实例名称，进入实例概览页面，在左侧导航栏选择"智能DBA助手 \> SQL限流"，创建限流规则限制高频问题SQL的并发数，防止连接数进一步上涨。
    
  
  - 排查连接暴涨的根本原因，检查应用是否存在异常重试逻辑或连接池配置问题。
  
  - 如果业务确实需要更多连接数，可通过控制台[修改max_connections参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)，或进行[规格升配](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_topic_scale_rds.html)。升配过程中实例可正常访问，但会有秒级连接闪断，建议在业务低峰期进行。
   
 
#### 常见问题
#### 如何查看当前实例的最大连接数？
可通过以下方式查看：
- 登录华为云控制台，单击实例名称，在实例概览页面查看实例规格对应的连接数上限。
- 通过SQL命令查看：**show variables like 'max_connections';**
 
#### 连接数达到上限后如何处理？
可通过以下步骤处理：
1. 登录华为云控制台，通过智能DBA助手的[实时会话](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0026.html)功能查看当前会话。
2. Kill空闲连接或问题会话释放连接资源。
3. 排查连接暴涨的根本原因，如连接池配置、应用异常重试等。
4. 如业务确实需要更多连接，可通过控制台[修改max_connections参数](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html)，或考虑[规格升配](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_topic_scale_rds.html)。
 
#### 如何避免连接数过载？
建议采取以下措施：
- 合理配置应用连接池参数，连接池最大连接数不超过实例最大连接数的70%\~80%。
- 设置合理的wait_timeout参数，及时释放空闲连接。
- 配置连接数告警，在连接数达到阈值时及时处理。
- 定期检查应用是否存在连接泄漏。
 
#### 为什么会出现大量Sleep状态的连接？
常见原因包括：
- wait_timeout参数设置过大，空闲连接未及时断开。
- 客户端连接池未配置空闲连接回收机制。
- 应用程序使用长连接但未正确管理连接生命周期。
 
#### 是否可以修改max_connections参数？
可以修改。max_connections是MySQL社区原生参数，华为云RDS for MySQL支持通过控制台修改该参数。修改方法如下：
1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
2. 在RDS for MySQL实例列表，单击实例名称，进入实例概览页面。
3. 在左侧导航栏选择"参数修改"，在参数列表中找到max_connections参数，修改为目标值。
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/notice_3.0-zh-cn.png)
   虽然max_connections可以修改，但实际可支撑的连接数还受实例内存、CPU等资源限制。每个连接会占用一定的内存资源（包括连接缓冲区、排序缓冲区等），连接数过多可能导致内存不足或性能下降。建议根据实际业务需求和实例资源情况合理设置max_connections值。
   
4. max_connections参数修改后立即生效，无需重启实例。
 
