
# 配置SQL限流
#### 操作场景
GaussDB提供SQL限流功能，当存在异常SQL（如存在不优索引）、SQL并发量上升时，通过SQL限流功能控制异常SQL的访问量或者并发量，保障服务的可用性。
GaussDB还支持基于SQL的执行时间和执行次数，识别出性能消耗最高的SQL语句，并生成限流推荐规则，您可以基于高负载SQL创建相应的限流任务。
#### 前提条件
登录账号需要具备授权项"gaussdb:instance:listFlowlimit"、"gaussdb:instance:flowlimitAddOrUpdate"、"gaussdb:instance:createFlowLimit"、"gaussdb:instance:updateFlowLimit"、"gaussdb:instance:deleteFlowLimit"、"gaussdb:instance:getFlowLimitInfo"、"gaussdb:instance:getFlowLimitTemplate"、"gaussdb:instance:listFlowLimitInfo"、"gaussdb:instance:syncFlowLimit"和"gaussdb:instance:flowlimitDelete"。
#### 约束限制
- GaussDB实例的数据库引擎版本需要大于等于V2.0-8.0.1，内核版本大于等于505.0.0。
- 分布式不支持自治限流任务。
- 不支持对系统级别用户（例如root等）进行SQL限流。
- 当前不支持批量删除SQL限流任务。
- 每个实例最多支持1000条限流任务。
- 对于关键词限流任务，一个关键词中包含英文逗号视作以逗号分隔的两个关键词，作用时不区分关键词前后顺序。
- SQL限流支持紧急通道功能。高负载场景下，当普通通道资源耗尽无法执行SQL限流任务时，单击列表上方"紧急通道"开关，开启后创建SQL限流任务、查询SQL限流列表、查询SQL限流详情、更新SQL限流任务、删除SQL限流任务操作会走紧急通道建立连接。注意，紧急通道的资源有限，仅在普通通道资源不足无法请求的时候使用紧急通道，运维操作完成后必须关闭紧急通道选项。
- 用户通过系统级别用户（例如root等）进行后台SQL限流的增删改，会导致实际限流任务情况与前端不一致。
- 限流规则匹配会消耗CPU性能，建议同一个实例里不要创建大量限流规则。
- 新添加SQL限流规则之前已经开始执行的SQL语句不会被计入并发数。
- 容灾场景下，主实例上的限流规则会自动同步到备实例，容灾升主后暂时不支持限流规则的增删改，切回原实例后可继续管理限流任务。
- 实例异常和规格变更期间允许创建、修改、查看限流规则，但可能会失败，如果出现失败或异常可以通过删除限流规则处理，删除前请确保数据库正常。
- 驱动建立数据库连接涉及的SQL语句（如：select setting from pg_settings where name='delimiter_name'）被限流会导致无法新建连接，不允许该类SQL的限流操作。
- 实例节点在创建、重启过程中（比如扩副本、扩分片），可能会因为节点无法连接导致SQL限流任务详情查询异常。
- 内核如果抛出报错信息，如ERROR: The workload rule takes effect and this request will be cancelled. rule_id: x, rule_name: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"，其中rule_name对应Console控制台"限流任务ID"，对应审计日志task id。
- 避免创建同名表。如果不同Database或不同SCHEMA下存在同名表，创建该表相关的SQLID限流任务时，限流规则可能不生效。
- 自治限流场景下，当CPU利用率、内存利用率、并发数（最大活跃会话数）三者均超过阈值，才会触发自治限流规则生效。
- 紧急通道的资源有限，仅在普通通道资源不足无法请求的时候使用紧急通道，运维操作完成后必须关闭紧急通道选项。分布式场景下DN组件无法使用该功能，请选择CN组件节点。
 
#### 查看推荐规则
1. [登录云数据库GaussDB控制台](https://console.huaweicloud.com/gaussdb/?locale=zh-cn#/gaussdb/management/list)。
2. 在"实例管理"页面，选择指定的实例，单击实例的名称，进入实例详情页面。
3. 选择"诊断优化 \> 限流管理"。
4. 在"SQL限流任务"页签，单击"推荐规则"，选择规则查询条件和TOP SQL。 
   图1推荐规则   
   ![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002679853147.png "点击放大")
   
   - 在高负载或线程池满等情况下，通过常规通道下发运维命令可能失败或超时。此时，用户可单击![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002649773440.png "点击放大")打开紧急通道以保证运维命令的正常执行。
   
   - 根据实时会话数据，按SQL ID分组推荐限流规则，推荐策略如下：
     - 全部：按平均执行时间、最长执行时间、执行次数分别降序排序，各取Top N推荐。
     
     - 执行次数：按组内执行次数降序排序，取Top N推荐。
     
     - 平均执行时间：按组内平均执行时间降序排序，取Top N推荐。
     
     - 最长执行时间：按组内最长执行时间降序排序，取Top N推荐。
      
   
   
   
   
5. 如果您需要为筛选的高负载SQL进行SQL限流，单击操作列的"SQL ID限流"或"关键字限流"，新建"SQL限流任务"。更多内容请参考[创建限流任务]。
 
 #### 创建限流任务
1. [登录云数据库GaussDB控制台](https://console.huaweicloud.com/gaussdb/?locale=zh-cn#/gaussdb/management/list)。
2. 在"实例管理"页面，选择指定的实例，单击实例的名称，进入实例详情页面。
3. 选择"诊断优化 \> 限流管理"。
4. 选择"SQL限流任务"或"自治限流任务"，单击"创建任务"，填写限流信息，具体参数填写请参考[表1]。
   
   在数据库实例高负载场景下，用户可单击![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002680012995.png "点击放大")打开紧急通道，以快速创建任务。
   - 创建SQL限流任务 
     
     图2创建SQL限流任务   
     ![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002649773434.png "点击放大")
     
     
      表1SQL限流任务参数 
     | 限流任务类型                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 参数名    | 参数说明                                                                                                                                                                                                         |
     |:---|:---|:---|
     | SQLID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 限流任务名称 | 自定义SQL限流任务名称。                                                                                                                                                                                                |
     | SQLID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | SQL模板  | 系统会记录各个节点的SQL语句执行记录，并转化成一个模板。用户可以选择该模板下发到各节点上进行SQL限流。 说明： 当某个实例重启时，该实例节点的SQL模板会清空。 |
     | SQLID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 并发数    | 同一时间该节点执行被限制SQL的最大活跃连接数。                                                                                                                                                                                     |
     | SQLID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 生效时间   | 选择限流生效时间。                                                                                                                                                                                                    |
     | 关键词 说明： - 关键词数量范围为\[2,100\]个，每个关键词长度范围\[2,64\]位。  - 关键词不区分大小写。  - 关键词越少，对应限流的SQL范围越大。   | 限流任务名称 | 自定义SQL限流任务名称。                                                                                                                                                                                                |
     | 关键词 说明： - 关键词数量范围为\[2,100\]个，每个关键词长度范围\[2,64\]位。  - 关键词不区分大小写。  - 关键词越少，对应限流的SQL范围越大。   | SQL类型  | SQL类型，只支持select，insert，update，delete，merge五种类型。                                                                                                                                                              |
     | 关键词 说明： - 关键词数量范围为\[2,100\]个，每个关键词长度范围\[2,64\]位。  - 关键词不区分大小写。  - 关键词越少，对应限流的SQL范围越大。   | 关键词    | 限流任务匹配的关键词，限流任务根据该关键词加上SQL类型进行语句匹配，匹配到的SQL将会限流。                                                                                                                                                              |
     | 关键词 说明： - 关键词数量范围为\[2,100\]个，每个关键词长度范围\[2,64\]位。  - 关键词不区分大小写。  - 关键词越少，对应限流的SQL范围越大。   | 作用库    | 限流作用的数据库。                                                                                                                                                                                                    |
     | 关键词 说明： - 关键词数量范围为\[2,100\]个，每个关键词长度范围\[2,64\]位。  - 关键词不区分大小写。  - 关键词越少，对应限流的SQL范围越大。   | 并发数    | 同一时间该节点执行被限制SQL的最大活跃连接数。                                                                                                                                                                                     |
     | 关键词 说明： - 关键词数量范围为\[2,100\]个，每个关键词长度范围\[2,64\]位。  - 关键词不区分大小写。  - 关键词越少，对应限流的SQL范围越大。   | 生效时间   | 选择限流生效时间。                                                                                                                                                                                                    |
        
     
   
   - 创建自治限流任务 
     
     图3创建自治限流任务   
     ![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002680013005.png "点击放大")
     
     
     表2自治限流任务参数 
     | 参数名    | 参数说明                                                                                  |
     |:---|:---|
     | 限流场景选择 | 触发限流的条件场景，目前只支持阈值条件触发。                                                                |
     | 限流任务名称 | 限流任务名称。                                                                               |
     | CPU利用率 | 该节点触发限流的CPU利用率阈值，当同时超过内存利用率设定阈值条件时限流生效，不支持和内存利用率阈值同时为0，如果选择只限制CPU、内存中的其中一个，则另一个必须传值0。 |
     | 内存利用率  | 该节点触发限流的内存利用率阈值，当同时超过CPU利用率设定阈值条件时限流生效，不支持和内存利用率阈值同时为0，如果选择只限制CPU、内存中的其中一个，则另一个必须传值0。 |
     | 并发数    | 同一时间该节点执行任意操作命令的最大活跃连接数。                                                              |
        
     
   
   
   
   
5. 单击"创建"，提交创建SQL限流。
6. 创建完成后，可以查看任务限流状态或修改限流任务。 
   - 单击 "详情"，查看任务限流状态。 
     图4查看SQL限流任务详情   
     ![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002680013001.png "点击放大")
     
     图5SQL限流任务详情   
     ![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002679853149.png "点击放大")
     
     
   
   - 选择一个限流任务，单击"修改"，可以修改限流任务。 
     图6修改限流任务   
     ![](https://support.huaweicloud.com/usermanual-gaussdb/figure/zh-cn_image_0000002649773444.png "点击放大")
     
     
   
   - 选择一个限流任务，单击"删除"，可以删除限流任务。
   
   
   ![](https://support.huaweicloud.com/usermanual-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   当规则修改、重启、主备倒换等变更之后，限流任务拦截次数会清空。
   
   
 
