
# 新建SQL限流规则
#### 操作场景
SQL限流是指通过设置语句类型、关键字等匹配SQL语句，当所匹配的SQL语句超过设置的最大并发数时，数据库实例会拒绝执行此SQL。从而解决SQL并发数过高导致的实例不稳定问题。
可能引起SQL并发过高的场景有：
- 业务流量突增：出现缓存穿透、异常调用等情况，导致某类SQL并发数急剧上升。
- 慢查询堆积：未创建索引的SQL被大量调用，出现大量慢SQL，影响正常业务。
 
 #### 版本约束限制
SQL限流功能对于不同实例类型的版本约束请参见[表1]。实例版本的查询方法请参见[如何查看云数据库RDS实例的版本号](https://support.huaweicloud.com/rds-mysql_faq/rds_faq_0211.html)。
5.6.51.4以下内核版本、5.7.33.5以下内核版本、以及8.0.25.220700以下内核版本的实例限流规则不区分用户类型，配置限流规则时建议包含表名，单独配置SELECT关键字会影响功能使用。
 表1SQL限流对实例类型的版本限制 
| 大版本                                    | 主实例小版本                                               | 只读实例小版本                                             | 只读实例单独设置规则                                           | 支持"INSERT"类型限流规则                                   | 支持设置限流规则时效                                                   |
|:---|:---|:---|:---|:---|:---|
| 8.4                                    | ≥ 8.4.7.251200                                       | ≥ 8.4.7.251200                                      | 暂不支持                                                 | ≥ 8.4.7.251200                                     | ≥ 8.4.7.251200                                               |
| 8.0                                    | ≥ 8.0.25.1                                           | ≥ 8.0.25.1                                          | 暂不支持                                                 | ≥ 8.0.32.240100                                    | ≥ 8.0.28.230700                                              |
| 5.7 5.6 | ≥ 5.7.31.4 ≥ 5.6.50.3 | ≥ 5.7.37.1 ≥ 5.6.51.6 | ≥ 5.7.38.221000 暂不支持 | ≥ 5.7.44.240100 暂不支持 | ≥ 5.7.41.230700 ≥ 5.6.51.230700 |
   
SQL限流功能对于内置用户和root用户请求的版本约束请参见[表2]。
 表2SQL限流对用户的版本限制 
| 大版本 | 小版本                            | 内置用户 | root用户 |
|:---|:---|:---|:---|
| 8.0 | ≥ 8.0.28.231000                | 不受限  | 受限     |
| 8.0 | 8.0.25.1 ≤ 版本 \< 8.0.28.231000 | 不受限  | 不受限    |
| 8.0 | \< 8.0.25.1                    | 受限   | 受限     |
| 5.7 | ≥ 5.7.43.231000                | 不受限  | 受限     |
| 5.7 | 5.7.33.1 ≤ 版本 \< 5.7.43.231000 | 不受限  | 不受限    |
| 5.7 | \< 5.7.33.1                    | 受限   | 受限     |
| 5.6 | ≥ 5.6.51.4                     | 不受限  | 不受限    |
| 5.6 | \< 5.6.51.4                    | 受限   | 受限     |
   
MySQL 5.7（≥ 5.7.43.231000）、MySQL 8.0（≥ 8.0.28.231000）和MySQL 8.4版本的实例，root用户会被限流，如果需要对root用户不限流，请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)处理。
建议RDS for MySQL小版本升级内核到最新版本，SQL限流体验更佳，请参见[升级RDS for MySQL内核小版本](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0003.html)。
#### 功能限制
- 最多可配置100条限流规则。
- SQL限流功能当前仅支持SELECT、UPDATE、DELETE、INSERT关键字。
- 当SQL语句匹配多条限流规则时，优先生效最新添加的规则，之前的规则不再生效。
- 在添加SQL限流规则之前，已经开始执行的SQL语句，不会被记入并发数。
- 若复制时延过大，针对只读实例，新增或删除限流规则不会立刻生效。
- 系统表不受SQL限流的限制。
- 不涉及数据查询的SQL不受限流的限制，例如：**select sleep(** *\*\*\** **);**
- 暂不支持对事件调度器、存储过程、触发器、函数内的SQL做限流设置。
- 您可以在DAS执行如下SQL查看SQL限流规则的执行情况：**select \* from information_schema.rds_sql_filter_info;**
- 当设置过多限流规则时，对性能有一定影响，使用后请删除多余的规则。
- SQL限流规则不支持约束系统库。
 
#### 查看推荐规则
先查看推荐规则，按照用户选择的推荐因子分析当前执行的会话，推荐Top会话对应的SQL限流规则，再参考推荐规则[新建限流规则]。
1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002593882307.png)，选择区域。
3. 在"实例管理"页面，选择目标实例，单击实例名称，进入实例的"概览"页签。
4. 在左侧导航栏选择"智能DBA助手"下的"SQL分析与优化"。
5. 选择"SQL限流"。
6. 单击"推荐规则"，筛选关键字相同的会话，按照"全部"、"平均执行时间"、"最大执行时间"、"执行次数"查询TOP SQL的推荐规则。 
   图1推荐规则   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002541072438.png "点击放大")
   按查询规则取前1,000个会话，仅选取其中的SELECT类型会话，每个会话提取关键字，关键字相同的会话分为一组，按以下策略推荐：
   - 全部：分别以每组内会话平均执行耗时、最大执行耗时、执行次数降序排序，各取Top N的组推荐。
   
   - 平均执行时间：以每组内会话平均执行时间降序排序，取Top N的组推荐。
   
   - 最大执行时间：以每组内会话最大执行时间降序排序，取Top N的组推荐。
   
   - 执行次数：以每组内会话执行次数降序排序，取Top N的组推荐。
   
   
   
   
 
 #### 新建限流规则
1. [登录RDS管理控制台](https://console.huaweicloud.com/rds/#/rds/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002593882307.png)，选择区域。
3. 在"实例管理"页面，选择目标实例，单击实例名称，进入实例的"概览"页签。
4. 在左侧导航栏选择"智能DBA助手"下的"SQL分析与优化"。
5. 选择"SQL限流"。
6. 打开![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212223776.png)，开启SQL限流开关。SQL限流开关打开后，限流规则才能生效。
7. 单击"新建SQL限流规则"，配置SQL限流规则参数，参数说明请参见[表3]。
   
   图2新建SQL限流规则（直接输入关键字）   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002571552595.png "点击放大")
   图3新建SQL限流规则（SQL语句生成关键字）   
   ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002571432629.png "点击放大")
    表3SQL限流规则参数 
   | **参数** **项**  | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   |:---|:---|
   | SQL类型         | 支持选择四种类型：SELECT、UPDATE、DELETE、INSERT。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | 关键字生成方式       | 最多支持128个关键字，不区分大小写。支持以下两种方式输入关键字。 - **直接输入关键字** ：例如关键字是"select\~a"，含义为：select以及a为该并发控制所包含的两个关键字，\~为关键字间隔符，也就是说如果执行SQL语句中包含select与a两个关键字，那么命中此条并发控制规则。详细的匹配规则见[关键字匹配规则]。  - **原始SQL语句生成关键字**：输入原始SQL再单击"生成关键字"，生成的关键字仅供参考，请谨慎使用。   单个关键字首尾的空白字符会被忽略，包括' '、'\\n'、'\\r'、'\\t'等。 关键字生效规则见[关键字匹配规则]。 |
   | 最大并发数         | 输入最大并发数，与关键字匹配的SQL语句如果超过最大并发数会被拒绝执行。取值范围为0\~1000000000。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | kill满足规则的已有会话 | 勾选此选项后，会结束所有受SQL限流控制的账户所产生的会话。 root用户不受SQL限流限制的版本详见[版本约束限制]。                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 设置规则时效        | 选择时效为"永久"或"限时"。 - 永久：即规则一直生效。  - 限时：失效时间可能存在延迟误差，最长不超过1分钟，限时SQL限流失效后规则会自动删除。                                                                                                                                                                                                                                                                                                                             |
      
   
   
8. 确认无误后，单击"确定"。
 
 #### 关键字匹配规则
限流规则是由一串由'\~'分隔的关键字序列组成。限流规则按**纯文本顺序匹配** 关键字。关键字匹配时**不区分大小写** ，配置多个关键字时，SQL 语句需要**按配置顺序完整包含所有关键字**，才会匹配该限流规则。关键字之间可以包含任意内容，也可以不包含内容。
- **示例 1：关键字间隔/顺序匹配**
  限流规则配置为：
  ```
  key_word1~key_word2~key_word3
  ```
  则只有SQL文本中依次出现*key_word1* 、*key_word2* 、*key_word3*时，才会匹配该规则。
  - 关键字中间包含其他内容，可以匹配：
    ```
    SELECT key_word1 xxx  FROM table_name WHERE key_word2 xxx key_word3;
    ```
    
  
  - 关键字中间不包含内容，可以匹配：
    ```
    SELECT key_word1key_word2key_word3 FROM table_name;
    ```
    
  
  - 关键字出现顺序不一致，不能匹配：
    ```
    SELECT key_word1 xxx key_word3 xxx key_word2 FROM table_name;
    ```
    
   
- **示例 2：纯文本匹配**
  关键字匹配是按照纯文本进行匹配，不感知SQL关键字。例如对于下面的限流规则，在关键字匹配时只关注SELECT和JOIN文本是否按顺序出现，不区分INNER JOIN或LEFT JOIN。
  限流规则配置为：
  ```
  SELECT~JOIN
  ```
  可以匹配：
  ```
  SELECT * FROM orders INNER JOIN users ON orders.user_id = users.id;
  ```
  也可以匹配：
  ```
  SELECT * FROM orders LEFT JOIN users ON orders.user_id = users.id;
  ```
  
 
#### 后续操作
如果不需要此条SQL限流规则，在SQL限流列表的操作列单击"删除"并"确定"。
图4删除SQL限流   
![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002510921048.png "点击放大")
#### 常见问题
- [RDS for MySQL CPU过载定位及处理建议](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_00005.html)
- [RDS for MySQL内存过载定位及处理建议](https://support.huaweicloud.com/usermanual-rds-mysql/rds_03_0097.html)

- [RDS for MySQL慢SQL问题处理](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_00009.html)
 
