10.4. 运行时扫描

运行时扫描方式,提供jdbc代理拦截运行时SQL,支持以目标库执行的方式评估兼容性,也可选择按照静态扫描的规则进行兼容性评估。

配置文件 application.yaml 中修改配置项 scanSourcejdbcproxy 时,即为 运行时扫描模式

10.4.1. JDBC代理

JDBC代理负责拦截运行时SQL发送到兼容评估服务。

  • 将jdbc代理外挂到服务的目录(jvm类加载器可以加载到)

  • 服务的静态数据源配置修改

    数据源的驱动类修改为“com.hundsun.lightdb.monitor.proxy.Driver”
    
  • 服务启动增加jvm系统参数

    参数

    说明

    sqlmonitor.websqlcheck

    将拦截的sql发送到兼容扫描服务开关,取值范围: true,false

    sqlmonitor.targetDbType

    源库到目标库适配,多个以英文逗号分隔,取值范围请参阅 在线扫描 小节中targetDBType可传参数的表格

    sqlmonitor.websqlcheckUrl

    服务运行时拦截到的sql发送到兼容评估服务的url,比如http://<ip>:<port>/webChecker/processSql,其中port为配置中server.port端口号

10.4.2. 启动兼容评估服务

兼容评估服务负责接收JDBC拦截的SQL,并进行兼容性评估

  • 修改配置项 scanSourcejdbcproxy

  • 执行run.bat启动服务

10.4.3. 目标库执行的方式

运行时扫描也支持目标数据库执行的方式评估SQL的兼容性

  • 修改配置项 scanSourcejdbcproxy

  • 修改配置项 evalMethodexecute

  • 填写配置项 targetdatabase 中目标数据库的连接信息,包括jdbcUrl、username、password

  • 执行run.bat启动服务

警告

以目标库执行的方式评估兼容性时,不支持 优化器提示 部分的评估

10.4.4. 评估结果

  • 运行时扫描生成的扫描结果保存在服务根目录的jdbcproxy_check_report文件夹,以report_日期.txt命名,每日一个文件

  • 评估结果文件以分号(;)分割,符合LightDB的COPY命令的格式

  • 使用COPY命令导入扫描结果(csv)到表

1 创建表proxy_check_report(依赖lightdb数据库)
     create table proxy_check_report (
             state varchar,
             description varchar,
             executeMsg varchar,
             sql varchar,
             clause varchar,
             scanRegexp varchar,
             suggestion varchar,
             sourceDB varchar,
             targetDB varchar,
             dateTime varchar
);
2 使用copy命令导入扫描结果(csv)到表proxy_check_report
     copy proxy_check_report from '/mnt/data/migrate-assist-server/jdbcproxy_check_report/report_20240606.txt' csv header delimiter ';';
3 执行sql命令查询不兼容项的统计结果
     select scanregexp,count(*) from proxy_check_report where state='fail' group by scanregexp;
4 具体操作如下:
     [lightdb@linuxtest ~]$ ltsql -p5432
     ltsql (13.8-22.4)
     Type "help" for help.
     lightdb@postgres=# create database testdb1;
     CREATE DATABASE
     lightdb@postgres=# \c testdb1;
     You are now connected to database "testdb1" as user "lightdb".
     lightdb@testdb1=#
     lightdb@testdb1=#
     lightdb@testdb1=#
     lightdb@testdb1=#
     lightdb@testdb1=#
     lightdb@testdb1=# create table proxy_check_report (
     lightdb@testdb1(#      state varchar,
     lightdb@testdb1(#      description varchar,
     lightdb@testdb1(#      executeMsg varchar,
     lightdb@testdb1(#      sql varchar,
     lightdb@testdb1(#      clause varchar,
     lightdb@testdb1(#      scanRegexp varchar,
     lightdb@testdb1(#      suggestion varchar,
     lightdb@testdb1(#      sourceDB varchar,
     lightdb@testdb1(#      targetDB varchar,
     lightdb@testdb1(#      dateTime varchar
     lightdb@testdb1(# );
     CREATE TABLE
     lightdb@testdb1=# copy proxy_check_report from '/mnt/data/migrate-assist-server/jdbcproxy_check_report/report_20240606.txt' csv header delimiter ';';
     COPY 70
     lightdb@testdb1=# select scanregexp,count(*) from proxy_check_report where state='fail' group by scanregexp;
     -[ RECORD 1 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ------------------------------------------------------------------------------------------------------
     scanregexp | \bhigh_priority\b
     count      | 1
     -[ RECORD 2 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ------------------------------------------------------------------------------------------------------
     scanregexp | delete\s+(\w+|\`\w+\`)(\s*,\s*(\w+|\`\w+\`))*\s+from\s+(?:\w+|\`\w+\`)(?:\.(\w+|\`\w+\`))?\s+(as\s+(\w+|\`\w+\`)\s+)?((inner|left|right|full)\s+join\s+(?:\w+|\`\w+\`
     )(?:\.(\w+|\`\w+\`))?\s+(as\s+(\w+|\`\w+\`)\s+)?)+
     count      | 1
     -[ RECORD 3 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ------------------------------------------------------------------------------------------------------
     scanregexp | INSERT\s+INTO\s+[\s\S]+?\s+ON\s+DUPLICATE\s+KEY\s+(UPDATE|IGNORE)\s+
     count      | 2
     -[ RECORD 4 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ------------------------------------------------------------------------------------------------------
     scanregexp | \bWITH\s+RECURSIVE
     count      | 1
     -[ RECORD 5 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ------------------------------------------------------------------------------------------------------
     scanregexp | \bSET\s+MAX_EXECUTION_TIME\b
     count      | 2
     -[ RECORD 6 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ------------------------------------------------------------------------------------------------------