
# RDS for MySQL CPU过载定位及处理建议
#### 场景介绍
CPU过载的典型表现为数据库实例的CPU使用率在短时间内（几十秒到几分钟）从正常水平迅速飙升至100%，导致数据库连接卡死、请求超时、服务不可用。本文针对此类CPU峰值场景，分析常见原因并提供处理建议。
#### 可能原因
- **慢SQL过多且大量并发执行**
  在短时间内，大量并发执行一个或多个执行效率低的SQL语句（例如未命中索引的多表JOIN、缺少LIMIT的全表扫描、对大数据量的排序或分组操作），每条SQL都会消耗大量CPU时间，导致并发量上升后CPU迅速占满。
  典型特征：慢查询日志中同一类SQL在冲顶时间点大量出现。执行 **show processlist** 中看到多个相同SQL处于Sending data、Copying to tmp table等状态。
  
- **索引设计不合理或索引失效导致突发全表扫描**
  原本能够正常使用索引的SQL语句，因以下原因突然变为全表扫描，单次执行成本增加数个数量级：
  - 表结构变更（如新增字段导致原有索引不再最优）。
  
  - 统计信息陈旧，优化器选择了错误执行计划。
  
  - WHERE条件中对索引列使用函数、隐式类型转换或字符集不一致。
  
  - 大量更新后索引碎片严重。
  
  
  当这类SQL的并发数较高时，全表扫描导致的CPU资源消耗会瞬间达到峰值。
  验证方法：使用 **EXPLAIN** 查看冲顶时刻的SQL执行计划，关注 type=ALL 或 key=NULL 。
  

- **业务流量瞬间峰值**
  在促销活动、热点事件、缓存穿透等场景下，业务请求量在数秒内激增数倍甚至数十倍，导致数据库连接数随之急剧上升。虽然每条SQL本身执行效率较高，但因并发度过高，CPU仍会被占满。
  典型特征：
  - 在流量冲顶的时间点，QPS监控曲线出现急剧尖峰。
  
  - 活跃连接数出现急剧的峰值。
  
  - 在慢查询日志中未发现明显的异常SQL（扫描行数过高、磁盘排序等），部分高效SQL变慢。
   
 
#### 对业务的影响
CPU冲顶对业务的影响如下：
- 导致数据库处理能力骤降，所有SQL执行延迟急剧增加。
- 新建连接请求超时，已有连接出现卡死现象。
- 严重时数据库处于假死状态，业务完全中断。
 
#### 处理建议
- **出现过载异常前的建议：**
  - 定期分析慢SQL：使用华为云DAS的[慢SQL分析](https://support.huaweicloud.com/usermanual-das/das_04_0100.html)功能，提前发现潜在的低效SQL并优化。
  
  - 配置CPU、活跃连接数告警：建议针对生产实例，配置CPU 70% 时连续五次告警、活跃连接数大于CPU核心数\*3 时连续五次告警。
  
  - 开启全量SQL审计：通过[SQL审计](https://support.huaweicloud.com/usermanual-rds-mysql/rds_sql_auditing_log.html)记录所有执行语句，便于事后快速定位问题SQL。
  
  - 合理设置连接池上限：根据实例规格配置应用连接池的maximumPoolSize，避免连接数超过数据库承载能力。
  
  - 上线前SQL审核：使用DAS的[SQL诊断](https://support.huaweicloud.com/usermanual-das/das_04_0100.html)工具对新SQL进行执行计划分析，确保命中索引。
   

- **过载异常中的建议：**
  - 方法一：SQL限流（推荐首选） 当CPU冲顶由特定SQL模式引起时，使用华为云RDS for MySQL的[SQL限流](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0033.html)功能快速切断问题源。通过设置关键字和最大并发数，当匹配的SQL并发超过阈值时自动拒绝执行。
    
  
  - 方法二：自治限流（自动过载保护） 配置[自治限流](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0034.html)，设定CPU阈值（如 ≥95%）、活跃会话数、持续时间等条件，系统自动触发限流，无需人工介入。适用于流量突发不可预测、无法快速定位 SQL 的场景。需要注意的是，自治限流为轮询查杀会话的逻辑实现方式，针对异常流量或低效SQL存在重试的场景作用有限。
    
  
  - 方法三：Kill 异常会话 紧急情况下，通过 **show full processlist** 定位消耗CPU较高的会话（状态为Sending data、Copying to tmp table等），执行**kill** *\<会话ID\>* 直接终止。可在[实时会话](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0026.html)页面批量操作。
    
  
  - 方法四：临时升级规格或开启读写分离 升级CPU规格：若业务量持续增长，通过[变更规格](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_topic_scale_rds.html)提升实例处理能力。
    添加只读实例：使用[数据库代理](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0016.html)将查询流量分流到只读实例，减轻主库压力。
    
   
- **过载异常后的复盘优化：**
  - 关联慢日志与监控：在实例监控中查看CPU冲顶时间点的慢SQL数量、慢日志详情等，定位高消耗SQL。
  
  - 使用DAS进行SQL优化：将问题SQL导入[DAS SQL诊断](https://support.huaweicloud.com/usermanual-das/das_04_0100.html)，获取索引建议和重写方案。
  
  - 分析索引使用情况：检查冲顶时刻的慢SQL是否因索引失效导致全表扫描，必要时使用 **OPTIMIZE TABLE** 重建索引或更新统计信息。
  
  - 清理SQL限流规则：限流规则过多会影响性能，事后及时删除不再需要的规则。
  
  - 评估业务流量模型：若频繁出现业务峰值，考虑接入[读写分离](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0017.html)或使用[分布式数据库中间件 DDM](https://support.huaweicloud.com/ddm/index.html)进行水平扩展。
   
 
