3.4. 运行时扫描
运行时扫描方式,提供jdbc代理拦截运行时SQL,支持以目标库执行的方式评估兼容性,也可选择按照静态扫描的规则进行兼容性评估。
配置文件 application.yaml
中修改配置项 scanSource
为 jdbcproxy
时,即为 运行时扫描模式 。
3.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端口号
3.4.2. 启动兼容评估服务
兼容评估服务负责接收JDBC拦截的SQL,并进行兼容性评估
修改配置项
scanSource
为jdbcproxy
执行run.bat启动服务
3.4.3. 目标库执行的方式
运行时扫描也支持目标数据库执行的方式评估SQL的兼容性
修改配置项
scanSource
为jdbcproxy
修改配置项
evalMethod
为execute
填写配置项
targetdatabase
中目标数据库的连接信息,包括jdbcUrl、username、password执行run.bat启动服务
警告
以目标库执行的方式评估兼容性时,不支持 优化器提示 部分的评估
3.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 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------