
# 使用TaurusDB的SQL限流
#### 操作场景
SQL限流是指通过设置SQL类型、关键字等匹配SQL语句，当所匹配的SQL语句超过设置的最大并发数时，数据库实例会拒绝执行此SQL，从而解决SQL并发数过高导致的实例不稳定问题，并支持查看当前限流规则已拦截次数。
您也可以基于SQL的执行时间或执行次数，识别出性能消耗最高的SQL语句，并为这些高负载SQL创建相应的限流规则。
#### 版本约束
SQL限流支持的TaurusDB内核版本如下：
- 内核版本大于等于2.0.28.15且小于2.0.28.40时，支持SELECT、UPDATE、DELETE类型的限流规则。
- 内核版本大于等于2.0.29.1时，支持SELECT、UPDATE、DELETE类型的限流规则。
- 内核版本大于等于2.0.54.240600时，支持SELECT、UPDATE、DELETE、INSERT类型的限流规则。
 
内核版本的查询方法请参见[如何查看云数据库 TaurusDB实例的版本号](https://support.huaweicloud.com/taurusdb_faq/taurusdb_faq_0141.html)。
#### 关键字匹配规则
限流规则是由一串由'\~'分隔的关键字序列组成。限流规则按**纯文本顺序匹配** 关键字。关键字匹配时**不区分大小写** ，配置多个关键字时，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;
  ```
  
 
#### 约束限制
表1限流规则约束 
| 场景           | 约束                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|
| 设置限流规则       | - 单个限流规则最大支持128个关键字，关键字不能是单个反斜杠（\\） 或单个空字符（' '）。关键字首尾的空格和特殊空白字符（如'\\t'、'\\r'、'\\n'）都会被忽略掉。  - 限流规则不能以"\~"结尾。  - TaurusDB内核版本大于等于2.0.69.250900时，单条规则长度不能超过1000 bytes**，** 限流规则总条数不超过100条**。**  - TaurusDB内核版本大于等于2.0.54.240600时，单个SQL类型（SELECT、UPDATE、DELETE、INSERT）的所有规则和对应的并发数加起来长度不能超过4000 bytes，单条规则长度不能超过1000 bytes。  - TaurusDB内核版本小于2.0.54.240600时，单个SQL类型（SELECT、UPDATE、DELETE）的所有规则和对应的并发数加起来长度不能超过1024 bytes。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| 匹配限流规则       | - 添加SQL限流规则后，已经执行中的SQL不会被新添加的规则限制，只有系统新收到的SQL才会进行规则匹配。  - 若主节点和只读节点设置了不一样的限流规则，实例主节点和只读节点倒换之后，新的主节点规则和原来的只读节点一样，新的只读节点规则和原来的主节点一样。  - 当SQL语句匹配多条限流规则时，优先生效最新添加的规则，之前的规则将不再生效。  - 在添加SQL限流规则之前，已经开始执行的SQL语句，不会被记入并发数。  - 限流SQL的匹配规则为前缀匹配。例如：限流规则为"SELECT\~COUNT\~t1", SQL语句"SELECT COUNT(\*) FROM t1"和"SELECT COUNT(\*) FROM t1 LIMIT 1"都会被拦截。  - 如下操作的SQL限流规则将重新生成，且重新生成的限流规则的当前并发数以及已拦截次数将清零重新计算。 - 执行节点重启、打开SQL限流开关操作，所有SELECT/UPDATE/DELETE/INSERT类型的限流规则将重新生成。  - TaurusDB内核版本\<2.0.69.250900时，执行新增限流规则、删除限流规则，所有SELECT/UPDATE/DELETE/INSERT类型的限流规则将重新生成。     |
| 推荐规则         | - root账号执行的SQL不在推荐规则的范围内。  - SQL语句长度超过1000 bytes会自动截断，使用推荐规则时需要手动修改为合法SQL语句。  - 推荐规则仅从持续时间最长的1000个会话内进行统计。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 历史SQL限流规则    | - SQL限流规则列表中存量限流规则的创建时间将展示为"新增限流规则时支持设置规则时效"功能的上线时间，新增的限流规则的创建时间不受此约束。  - 仅支持查看近30天的已删除和已失效的SQL限流规则。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 不受SQL限流限制的场景 | - 系统表不限制。  - 不涉及数据查询的语句不限制，如"select sleep(xxx)；"语句。  - TaurusDB内核版本 \< 2.0.45.230900时，root账号不受SQL限流限制。  - 存储过程、触发器、函数内的SQL不限制。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 限流规则的影响      | - 随着限流规则的增加，性能可能会有所下降。使用后，请删除不必要的限流规则。  - 限流触发后业务侧会收到执行报错，报错信息为"ERROR 1317 (70100): Query execution was interrupted"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   
 #### 新增限流规则
1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002671347251.png)，选择区域。
3. 在"实例管理"页面，选择目标实例，单击实例名称，进入"实例概览"页面。
4. 在左侧导航栏选择"智能DBA助手"下的"SQL分析与优化"。
5. 选择"SQL限流"。
6. 在"SQL限流"页面，开启SQL限流开关。
7. 单击"新建SQL限流规则"，选择需要限流的SQL类型、关键字以及最大并发数。 
   图1新建SQL限流规则   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002572455908.png "点击放大")
   
   表2SQL限流规则参数 
   | **参数** **项**  | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   |:---|:---|
   | SQL类型         | 支持选择四种类型：SELECT、UPDATE、DELETE、INSERT。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 关键字           | 最多支持128个关键字，不区分大小写。支持以下两种方式输入关键字。 - **直接输入关键字**：例如关键字是"select\~a"，含义为：select以及a为该并发控制所包含的两个关键字，\~为关键字间隔符，也就是说如果执行SQL语句中包含select与a两个关键字，那么命中此条并发控制规则。  - **原始SQL生成关键字**：输入原始SQL再单击"生成关键字"，生成的关键字仅供参考，请谨慎使用。   关键字根据顺序匹配SQL语句。例如：a\~and\~b只会匹配a\>1 and b\>2，而不会匹配b\>2 and a\>1。 单个关键字首尾的空白字符会被忽略，包括' '、'\\n'、'\\r'、'\\t'等。 |
   | 最大并发数         | 输入最大并发数，与关键字匹配的SQL语句如果超过最大并发数会被拒绝执行。取值范围为0\~1000000000。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | kill满足规则的已有会话 | 勾选此选项后，会结束所有受SQL限流规则控制的账户所产生的会话。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 同步规则给其他节点     | 勾选此选项后，将新增的限流规则同步给同一实例的其他节点。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 设置规则时效        | SQL限流规则的生效时间。 - 永久：选择此选项，表示新增的SQL限流规则永久生效。  - 限时：设置的时间为SQL限流规则的失效时间，生效的开始时间即新增操作的下发时间。失效时间可能存在延迟误差，最长不超过1分钟。 失效时间最多可以选择当前时间后的两周。 失效的SQL限流规则可以通过单击右侧"历史SQL限流规则"查看。                                                                                            |
      
   
   
8. 确认无误后，单击"确定"。
9. 提示确认框中单击"确定"。
 
#### 推荐规则
1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002671347251.png)，选择区域。
3. 在"实例管理"页面，选择目标实例，单击实例名称，进入"实例概览"页面。
4. 在左侧导航栏选择"智能DBA助手"下的"SQL分析与优化"。
5. 选择"SQL限流"，单击"推荐规则"。
6. 弹框中选择规则查询条件，支持按"平均执行时间"和"执行次数"筛选Top SQL。 
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002434988138.png "点击放大")
   
   
   
7. 单击"确定"。
8. 如果您需要为筛选的高负载SQL进行SQL限流，单击操作列的"SQL限流"，弹框中新建SQL限流规则。更多内容请参考[新增限流规则]。
 
#### 删除限流规则
1. [登录TaurusDB管理控制台](https://console.huaweicloud.com/gaussdbformysql/#/management/list)。
2. 单击管理控制台左上角的![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002671347251.png)，选择区域。
3. 在"实例管理"页面，选择目标实例，单击实例名称，进入"实例概览"页面。
4. 在左侧导航栏选择"智能DBA助手"下的"SQL分析与优化"。
5. 选择"SQL限流"。
6. 选择目标SQL限流规则，单击操作列的"删除"。 
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002368484624.png "点击放大")
   
   您也可以选择一条或多条限流规则，单击上方的"批量删除"。
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002368644508.png "点击放大")
   
   
   
7. 弹框中确认删除的限流规则信息，如果勾选"同步规则给其他节点"，表示同一实例的其他节点的限流规则也会被删除，确认无误后单击"确定"。 
   图2删除限流规则   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002368484656.png "点击放大")
   
   
   
8. （可选）如果您需要查看已删除的SQL限流规则，可以单击"历史SQL限流规则"，查看已删除和已失效的限流规则。 
   图3查看历史SQL限流规则   
   ![](https://support.huaweicloud.com/usermanual-taurusdb/figure/zh-cn_image_0000002513303229.png "点击放大")
   
   
 
