polar_sql_mapping

更新时间:2024-12-20 08:51:09

当应用程序出现错误SQL,无法立即修改时,可以通过SQL映射功能,将错误的SQL映射为正确的SQL。SQL映射功能设置成功后,应用程序即使发送了错误的SQL,也会自动映射为正确的SQL。

注意事项

SQL映射功能会将字符串匹配的SQL全部映射为指定的SQL,请谨慎使用。

前提条件

确保所在数据库已创建polar_sql_mapping插件,新创建的数据库默认已创建该插件,旧的数据库仍需手动创建。

执行以下命令,手动创建插件。

CREATE EXTENSION polar_sql_mapping;

使用指南

  1. 设置polar_sql_mapping.use_sql_mapping参数,开启SQL映射功能,默认为off

    ALTER DATABASE [dbname] SET polar_sql_mapping.use_sql_mapping=on;
  2. 设置polar_sql_mapping.record_error_sql参数,开启自动收集错误的SQL功能, 默认为off

    ALTER DATABASE [dbname] SET polar_sql_mapping.record_error_sql=on;
    说明

    使用完SQL映射功能之后建议关闭错误记录功能,减少对性能的影响。

    ALTER DATABASE [dbname] SET polar_sql_mapping.record_error_sql=off;
  3. 查询错误的SQL。

    SELECT * FROM emp;

    返回结果如下:

    ERROR:  relation "emp" does not exist
  4. 错误的SQL被记录到了polar_sql_mapping.error_sql_info中,执行以下命令,查询polar_sql_mapping.error_sql_info详细信息。

    SELECT * FROM polar_sql_mapping.error_sql_info;

    返回结果如下:

     id |           query           |                      emessage                      | calls 
    ----+---------------------------+----------------------------------------------------+-------                               |     1
      1 | SELECT * FROM emp;        | relation "emp" does not exist                      |     1
    (1 rows)
  5. 建立映射关系,将error_sql_infoID1SQL映射成指定的SQL。

    SELECT polar_sql_mapping.insert_mapping_id(1, 'SELECT 1');
  6. 再次查询错误的SQL。

    SELECT * FROM emp;

    返回结果如下:

     ?column? 
    ----------
            1
    (1 row)
    说明

    对于大部分的应用程序都是使用PreparedStmt,在写新的SQL的时,需要注意占位符应该是$n而不是'?',示例如下:

    SELECT * FROM polar_sql_mapping.polar_sql_mapping_table;

    返回结果如下:

    id |            source_sql            |           target_sql
    ---+----------------------------------+---------------------------------
    4  | SELECT 1 FROM dual WHERE a = $1; | SELECT 1 FROM dual WHERE 1 = $1
    (1 row)

参数说明

参数

说明

参数

说明

polar_sql_mapping.max_num

用于控制最多被收集的不同的错误SQL的数量,超过设置数量的SQL会直接被忽略,如果需要修改则需要重启,默认值为10。

polar_sql_mapping.error_sql_info_clear()

用于清空已记录的错误SQL。

替换运行正常的SQL

如果遇到运行没有错误的SQL,仍然想替换,可按照以下步骤进行操作:

  1. 设置polar_sql_mapping.use_sql_mapping参数,开启SQL映射功能,默认为off

    ALTER DATABASE [dbname] SET polar_sql_mapping.use_sql_mapping=on;
  2. 设置polar_sql_mapping.record_error_sql参数,开启自动收集错误的SQL功能, 默认为off

    ALTER DATABASE [dbname] SET polar_sql_mapping.record_error_sql=on;
    说明

    使用完SQL映射功能之后建议关闭错误记录功能,减少对性能的影响。

    ALTER DATABASE [dbname] SET polar_sql_mapping.record_error_sql=off;
  3. 设置匹配模式,所有模式匹配的SQL都会被保存到polar_sql_mapping.error_sql_info中。

    在如下示例中,即含有test_tableSQL都会被抓取(匹配逻辑和SQL中的LIKE操作符一致)。

    1. 设置匹配模式。

      SET polar_sql_mapping.error_pattern TO '%test_table%';
    2. 开启匹配模式。

      SET polar_sql_mapping.record_error_sql TO true;
    3. 创建被抓取的SQL语句。

      SELECT * FROM test_table;
      
      SELECT a FROM test_table;
      
      SELECT max(a) FROM test_table;
    4. 查看polar_sql_mapping.error_sql_info中的抓取结果。

      SELECT * FROM polar_sql_mapping.error_sql_info;

      返回结果如下:

      id  |             query              |          emessage          | calls
      ----+--------------------------------+----------------------------+-------
        1 | SELECT * FROM test_table;      | Error Pattern Force Record |     1
        2 | SELECT a FROM test_table;      | Error Pattern Force Record |     1
        3 | SELECT max(a) FROM test_table; | Error Pattern Force Record |     1
      (3 rows)

      所有含有test_tableSQL都被抓取到了polar_sql_mapping.error_sql_info中。

  4. 将错误的SQL替换为正确的SQL。

    SELECT polar_sql_mapping.insert_mapping_id(x, 'text');
    说明

    其中,x表示SQLID,text表示SQL的文本,请根据实际情况进行替换。

  5. 使用完后需要进行还原操作,以免影响性能。

    RESET polar_sql_mapping.error_pattern;
  • 本页导读 (1)
  • 注意事项
  • 前提条件
  • 使用指南
  • 参数说明
  • 替换运行正常的SQL
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等