
# 操作指导
#### 前提条件
- 依赖项：无。
- 权限要求：执行系统函数需要对应的权限，详见[技术原理](https://support.huaweicloud.com/centralized-devg-v10-gaussdb/gaussdb-42-1010.html)。
 
#### 注意事项
- 识别异常SQL功能依赖于DBE_PERF.STATEMENT中的SQL信息，若DBE_PERF.STATEMENT的条目数量达到上限（上限由GUC参数instr_unique_sql_count设置），后续未记录于DBE_PERF.STATEMENT的SQL无法被自动识别为异常SQL。
- 不推荐设置GUC参数abnormal_sql_control_type的可选项sql_abnormal_other，设置后可能对正常SQL语句进行管控（如被查询的表数据量增加，但查询语句对应的unique_sql_id可能未发生变化，此时查询此表的CPU时间增加，有可能被检测为异常SQL）。
- 当白名单DBE_PERF.ABNORMAL_SQL_ALLOWLIST和管控名单DBE_PERF.ABNORMAL_SQL中存在同一类SQL时，实际以白名单为准，不对此SQL进行管控（可能的场景为先将SQL手动加入DBE_PERF.ABNORMAL_SQL_ALLOWLIST中再将SQL手动加入DBE_PERF.ABNORMAL_SQL）。
- 如果将某类SQL添加进入DBE_PERF.ABNORMAL_SQL_ALLOWLIST时，此类SQL在DBE_PERF.ABNORMAL_SQL也存在，会将DBE_PERF.ABNORMAL_SQL对应的条目清空。
 
#### 操作步骤
识别异常SQL功能和管控异常SQL功能均为自动执行，实际需要手动操作的仅有以下两项：
- 手动添加或删除异常SQL管控名单DBE_PERF.ABNORMAL_SQL中的条目。
  - 手动添加示例。
    ```
    gaussdb=# \x                                               // 开启扩展显示，方便查看
    Expanded display is on.
    gaussdb=# SELECT unique_sql_id,query FROM DBE_PERF.STATEMENT WHERE query like '%SELECT * FROM t1%';  // 获取测试语句的unique_sql_id
    -[ RECORD 1 ]-+------------------
    unique_sql_id | 2995072629
    query         | select * from t1;
    gaussdb=# CALL add_abnormal_sql('2995072629');             // 将对应SQL加入管控名单
    -[ RECORD 1 ]----+-------------
    add_abnormal_sql | ADD succeed.
    gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL;             // 查看管控名单，添加成功
    -[ RECORD 1 ]-----------+------------------------------
    unique_sql_id           | 2995072629                       // 此异常SQL的unique_sql_id
    abnormal_count          | 2147483647                       // GaussDB检测到此异常SQL的总次数（手动添加时值为2147483647）
    control_expiration_time | 2025-09-02 16:38:19.953392+08    // 此异常SQL若被管控，管控结束时间
    current_controllable    | f                                // 此异常SQL是否被管控（t为管控，f为未管控，由AbnormalSqlCpuWorker线程裁决）
    abnormal_type           | SQL_ABNORMAL_MANUAL              // 此异常SQL的类型（SQL_ABNORMAL_MANUAL为手动添加）
    ```
    
  
  - 手动删除示例。
    - 单条删除。
      ```
      gaussdb=# \x                                               // 开启扩展显示，方便查看
      Expanded display is on.
      gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL;             // 查看管控名单，存在多条语句
      -[ RECORD 1 ]-----------+------------------------------
      unique_sql_id           | 1689263352
      abnormal_count          | 2147483647
      control_expiration_time | 2025-09-02 17:10:46.585405+08
      current_controllable    | f
      abnormal_type           | SQL_ABNORMAL_MANUAL
      -[ RECORD 2 ]-----------+------------------------------
      unique_sql_id           | 2995072629
      abnormal_count          | 2147483647
      control_expiration_time | 2025-09-02 17:10:40.209399+08
      current_controllable    | f
      abnormal_type           | SQL_ABNORMAL_MANUAL
      gaussdb=# CALL clean_abnormal_sql('BY_ID', '1689263352');  // 删除单条语句
      -[ RECORD 1 ]------+---------------
      clean_abnormal_sql | Clean succeed.
      gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL;             // 删除单条成功
      -[ RECORD 1 ]-----------+------------------------------
      unique_sql_id           | 2995072629
      abnormal_count          | 2147483647
      control_expiration_time | 2025-09-02 17:10:40.209399+08
      current_controllable    | f
      abnormal_type           | SQL_ABNORMAL_MANUAL
      ```
      
    
    - 全部删除。
      ```
      gaussdb=# \x                                               // 开启扩展显示，方便查看
      Expanded display is on.
      gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL;             // 查看管控名单，存在多条语句
      -[ RECORD 1 ]-----------+------------------------------
      unique_sql_id           | 1689263352
      abnormal_count          | 2147483647
      control_expiration_time | 2025-09-02 17:10:46.585405+08
      current_controllable    | f
      abnormal_type           | SQL_ABNORMAL_MANUAL
      -[ RECORD 2 ]-----------+------------------------------
      unique_sql_id           | 2995072629
      abnormal_count          | 2147483647
      control_expiration_time | 2025-09-02 17:10:40.209399+08
      current_controllable    | f
      abnormal_type           | SQL_ABNORMAL_MANUAL
      gaussdb=# CALL clean_abnormal_sql('BY_ALL');              // 删除全部语句
      -[ RECORD 1 ]------+---------------
      clean_abnormal_sql | Clean succeed.
      gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL;            // 删除全部成功
      (No rows)
      ```
      
      
     
   
- 手动添加或删除异常SQL白名单DBE_PERF.ABNORMAL_SQL_ALLOWLIST中的条目。
  - 手动添加示例。
    ```
    gaussdb=# \x                                                // 开启扩展显示，方便查看
    Expanded display is on.
    gaussdb=# SELECT unique_sql_id, query FROM DBE_PERF.STATEMENT WHERE query like '%SELECT * FROM t1%';  // 获取测试语句的unique_sql_id
    -[ RECORD 1 ]-+------------------
    unique_sql_id | 2995072629
    query         | select * from t1;
    gaussdb=# CALL abnormal_sql_manage_allowlist('ADD', '2995072629');  // 添加到管控白名单
    -[ RECORD 1 ]-----------------+-------------
    abnormal_sql_manage_allowlist | ADD succeed.
    gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL_ALLOWLIST;    // 查看管控白名单，添加成功
    -[ RECORD 1 ]-+-----------
    unique_sql_id | 2995072629
    ```
    
  
  - 手动删除示例。
    ```
    gaussdb=# \x                                                // 开启扩展显示，方便查看
    Expanded display is on.
    gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL_ALLOWLIST;    // 查看管控白名单，存在多条语句
    -[ RECORD 1 ]-+-----------
    unique_sql_id | 1689263352
    -[ RECORD 2 ]-+-----------
    unique_sql_id | 2995072629
    gaussdb=# CALL abnormal_sql_manage_allowlist('DELETE', '1689263352'); // 从管控白名单删除
    -[ RECORD 1 ]-----------------+----------------
    abnormal_sql_manage_allowlist | DELETE succeed.
    gaussdb=# SELECT * FROM DBE_PERF.ABNORMAL_SQL_ALLOWLIST;    // 查看管控白名单，删除成功
    -[ RECORD 1 ]-+-----------
    unique_sql_id | 2995072629
    ```
    
   
 
