7. 校验结果
本章是对校验结果举例和说明。校验结果在输出日志和工作目录的report目录中,搜索关键字———不一致,即可得到结果。如果无不一致信息,则表明对比一致,迁移没有问题。
日志路径:{工作目录|user.dir}/logs/lightdb-etl/lightdb-etl.log
html比对报告路径:{工作目录|user.dir}/report
7.1. 表结构对比
根据配置的源数据库和目标数据库信息获取数据库的元数据。比较逻辑如下:
首先,忽略大小写匹配源库和目标库表名,如果未找到,则报错不存在,且终止比较。
接着比较表的列名,如果未找到,则报错不存在,且终止比较当前列。
然后根据源库和目标库的数据类型映射关系,比较数据类型、数值类型的精度和标度、字符类型的长度、日期类型的标度。
数据类型映射关系可通过json文件的方法进行个性化配置(暂支持oracle2gaussdb_oracle)。
最后,在
{工作目录|user.dir}/report目录下生成table_structure_compare_{时间}.html文件,以记录比对结果。
7.1.1. 数据类型映射关系json文件说明
数据类型映射json的位置,在
{工作目录|user.dir}/config/dataTypeCompareRules目录的源库2目标库.json文件。该文件json记录着源库和目标库的数据类型的映射关系,数值类型的精度和标度、字符类型的长度、日期的标度的比对规则。
源库的数据类型
sourceType和目标库的数据类型targetType是使用系统表查询的数据类型,非建表语句数据类型。
- 数值精度比对规则
precisionRule、 数值标度比对规则scaleRule、字符长度比对规则charLengthRule和日期标度比对规则dateLengthRule只支持取值0、1、2。0:表示不进行比较,1:表示进行等值比较,2:表示源库的值小于等于目标库即可
详细例子如下,以oracle2gaussdb_oracle.json为例:
oracle2gaussdb_oracle.json
# sourceType: 从系统表 all_tab_columns 获取的源数据库数据类型。
# targetType: 从系统表 information_schema.columns 获取的目标数据库数据类型。
# precisionRule: 数值类型精度的比较规则。
# scaleRule: 数值类型标度的比较规则。
# charLengthRule: 字符类型长度的比较规则。
# dateLengthRule: 日期标度的比较规则。
# 比较规则支持以下取值:0,1,2。
# 0 表示不进行比较;1 表示进行等值比较;2 表示源数据库的值小于等于目标数据库的值。
#
# 0 用于忽略不需要比较的值。例如,在字符类型比较时,只需比较字符长度(charLengthRule),而数值类型的精度(precisionRule)和标度(scaleRule)、日期的标度(dateLengthRule)则无需比较,因为这些在字符类型中没有实际意义,并且源库和目标库的差异可能导致值不一致。
# 2 用于在迁移后目标数据库的值可以大于等于源数据库的值。例如,对于 float(n) 类型, 由于数据库差异,源库的精度(precisionRule)为 n,而目标库的精度只能为 24 或 53。因此,只需确保目标库的 float 精度大于源库的精度,以保证数据迁移的正确性。
#字符类型
{"sourceType": "CHAR","targetType": "BPCHAR","precisionRule": 0,"scaleRule": 0,"charLengthRule": 1,"dateLengthRule": 0}
#数值类型
{"sourceType": "NUMBER","targetType": "NUMERIC","precisionRule": 1,"scaleRule": 1,"charLengthRule": 0,"dateLengthRule": 0}
#日期类型
{"sourceType": "DATE","targetType": "TIMESTAMP","precisionRule": 0,"scaleRule": 0,"charLengthRule": 0,"dateLengthRule": 2}
#二进制类型
{"sourceType": "NCLOB","targetType": "CLOB","precisionRule": 0,"scaleRule": 0,"charLengthRule": 0,"dateLengthRule": 0}
#其他
{"sourceType": "XMLTYPE","targetType": "XMLTYPE","precisionRule": 0,"scaleRule": 0,"charLengthRule": 0,"dateLengthRule": 0}
7.1.2. 比对报告展示举例
表结构的比对结果会在日志和html报告进行展示,以下列举了日志的输出样例和html报告样例。
##日志文件输出样例:
对比一致的会在第一行输出:
模式.表名对比一致
对比不一致的:
第一行输出:模式.表名对比不一致
第二行输出:对比不一致的原因。如下所示,如果数据类型不同,会输出数据类型不同,源数据库的数据类型是什么,目标数据类型是什么。
表结构对比开始
//对比一致
FUND60ACCO12.tbfundtaclientinfo13对比一致。FUND60ACCO12.tbfundtaclientinfo12对比一致。FUND60ACCO12.tbzdassetacc14对比一致。
//对比不一致
FUND60ACCO12.tbfundbakrestables112对比不一致
busin_type的数据类型不同, 源:VARCHAR2,目标:varchar2
ori_trans_date的数据类型不同, 源:NUMBER,目标:numeric
FUND60ACCO12.tbtatransaccount_bak13对比不一致
目标:invest_flag列不存在
目标:invest_code列不存在
FUND60ACCO12.sys_export_schema_01对比不一致
in_progress: 数据的精度不同,源:88,目标:null;
invest_flag: 数据的标度不同,源:88,目标:22;
invest_code:日期的标度不同,源:88,目标:22;
processing_state: 字符的长度不同,源:88,目标:22;
7.2. 表量对比
根据配置的源数据库和目标数据库信息获取数据库的元数据(获取表名、视图、索引、存储过程、函数、包、触发器)。比较逻辑如下:
首先,忽略大小写匹配源库和目标库表名、视图名、索引名、存储过程名、函数名、包名、触发器名,如果未找到,则报错不存在,且终止比较。
最后,在
{工作目录|user.dir}/report目录下生成type_compare_{时间}.html文件,以记录比对结果。
对比结果也会在日志的输出,会打印所有的内容,便于一些特殊报错的查询,以下是日志的结构说明:
首先输出:数量对比开始
然后输出:特殊的情况:如pg自动增加的索引:tbcustamlx1currents_pkey,oracle自动增加的索引:sys_il0007162376c00045$$,pg自动增加的分区表:tbcustamlx1currents_1_prt_atr
然后开始输出对比结果:
第一行输出:视图等对比开始
对比一致的会在第二行输出:
模式.表名对比一致。如 tbdictconvert对比一致 tbfundcentralizex8file14对比一致 tbfundcentralizex8file13对比一致
数量对比开始
表对比开始
etl.comprehensive_data_types_test对比一致
源库:不存在etl.hg_tbusinessfactor,目标库:存在etl.hg_tbusinessfactor
表对比成功数据 1 条,对比失败数据 4997 条
索引对比开始
etl无数据,对比一致
索引对比成功: 源库无数据,目标库无数据
视图对比开始
源库:存在etl.v_test_0902,目标库:不存在etl.v_test_0902
视图对比成功数据 0 条,对比失败数据 1 条
序列对比开始
源库:存在etl.iseq$$_265258,目标库:不存在etl.iseq$$_265258
源库:存在etl.iseq$$_261403,目标库:不存在etl.iseq$$_261403
序列对比成功数据 0 条,对比失败数据 2 条
包体对比开始
源库:存在etl.simple_pkg,目标库:不存在etl.simple_pkg
包体对比成功数据 0 条,对比失败数据 1 条
包对比开始
源库:存在etl.simple_pkg,目标库:不存在etl.simple_pkg
包对比成功数据 0 条,对比失败数据 1 条
存储过程对比开始
源库:存在etl.p_deal_amliplist_ip,目标库:不存在etl.p_deal_amliplist_ip
存储过程对比成功数据 0 条,对比失败数据 1 条
函数对比开始
源库:存在etl.f_enable_index,目标库:不存在etl.f_enable_index
函数对比成功数据 0 条,对比失败数据 1 条
类型对比开始
源库:存在etl.simple_type,目标库:不存在etl.simple_type
类型对比成功数据 0 条,对比失败数据 1 条
触发器对比开始
源库:存在etl.trg_fill_name,目标库:不存在etl.trg_fill_name
触发器对比成功数据 0 条,对比失败数据 1 条
7.3. 表数据对比
根据配置的源数据库和目标数据库信息获取数据库的元数据。比较逻辑如下:
首先比较相同表的列映射关系,包括列的数量和列名(忽略大小写)。如果不一致,则终止比较。
接着比较表的行数是否一致。如果不一致,则终止比较。
然后分别查询源数据库和目标数据库的数据进行比对。如果不一致,则终止比较。
最后,在
{工作目录|user.dir}/report目录下生成table_data_compare_{时间}.html文件,以记录比对结果。
##日志文件输出样例:
etl.tbfundconfirmstatdetailtmp对比不一致:
表列不一致,【oracle:id,a,b】,【lightdb:a,b,c】
etl.tbfundconfirmstatdetailtmp2对比不一致:
表列不一致,无法映射比对【oracle:id,a,b】,【lightdb:a,b,c】
etl.tbaccountopenasset16对比不一致:
[lightdb]:[public.tbaccountopenasset16]不存在
etl.t2对比不一致:
[lightdb]:[public.t2]表行数查询失败
etl.t3对比不一致:
表行数对比不一致,【oracle:302】,【lightdb:300】
etl.t4表无数据,对比一致
etl.t5对比不一致:
[lightdb]:[public.tbaccountopenasset16]数据值对比不一致