7. 校验结果

本章是对校验结果举例和说明。校验结果在输出日志和工作目录的report目录中,搜索关键字———不一致,即可得到结果。如果无不一致信息,则表明对比一致,迁移没有问题。 日志路径:{工作目录|user.dir}/logs/lightdb-etl/lightdb-etl.log html比对报告路径:{工作目录|user.dir}/report

7.1. 表结构对比

根据配置的源数据库和目标数据库信息获取数据库的元数据。比较逻辑如下:

  1. 首先,忽略大小写匹配源库和目标库表名,如果未找到,则报错不存在,且终止比较。

  2. 接着比较表的列名,如果未找到,则报错不存在,且终止比较当前列。

  3. 然后根据源库和目标库的数据类型映射关系,比较数据类型、数值类型的精度和标度、字符类型的长度、日期类型的标度。

  4. 数据类型映射关系可通过json文件的方法进行个性化配置(暂支持oracle2gaussdb_oracle)。

  5. 最后,在 {工作目录|user.dir}/report 目录下生成 table_structure_compare_{时间}.html 文件,以记录比对结果。

7.1.1. 数据类型映射关系json文件说明

  1. 数据类型映射json的位置,在 {工作目录|user.dir}/config/dataTypeCompareRules 目录的 源库2目标库.json 文件。

  2. 该文件json记录着源库和目标库的数据类型的映射关系,数值类型的精度和标度、字符类型的长度、日期的标度的比对规则。

  3. 源库的数据类型 sourceType 和目标库的数据类型 targetType 是使用系统表查询的数据类型,非建表语句数据类型。

  4. 数值精度比对规则 precisionRule 、 数值标度比对规则 scaleRule 、字符长度比对规则 charLengthRule 和日期标度比对规则 dateLengthRule 只支持取值0、1、2。

    0:表示不进行比较,1:表示进行等值比较,2:表示源库的值小于等于目标库即可

  5. 详细例子如下,以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;
../_images/table_structure_compare.png

7.2. 表量对比

根据配置的源数据库和目标数据库信息获取数据库的元数据(获取表名、视图、索引、存储过程、函数、包、触发器)。比较逻辑如下:

  1. 首先,忽略大小写匹配源库和目标库表名、视图名、索引名、存储过程名、函数名、包名、触发器名,如果未找到,则报错不存在,且终止比较。

  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 
../_images/typeCompare.png

7.3. 表数据对比

根据配置的源数据库和目标数据库信息获取数据库的元数据。比较逻辑如下:

  1. 首先比较相同表的列映射关系,包括列的数量和列名(忽略大小写)。如果不一致,则终止比较。

  2. 接着比较表的行数是否一致。如果不一致,则终止比较。

  3. 然后分别查询源数据库和目标数据库的数据进行比对。如果不一致,则终止比较。

  4. 为了避免不同数据库查询结果格式不一致,数据将进行统一格式化。有关详细信息,请参考 多发对规则数据类型映射

  5. 最后,在 {工作目录|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]数据值对比不一致
../_images/table_data_compare.png

7.4. 中间结果对比

中间结果对比通过配置对应的sql,对比源库和目标库的数据。报告路径和名称为: {工作目录|user.dir}/report/sqldatacompare_日期时间.html 同时为了避免不同数据库查询的出来格式不一致,可参考多发 比对规则数据类型映射

首先输出:中间结果对比的汇总信息

然后显示对比的SQL的ID、具体SQL、比对结果是否一致、操作命令查看不一致

../_images/sqldatacompare.png