2.8. 多发比对功能概览

本章节重点介绍比对服务的功能。功能清单列表如下:

比对服务功能概览

服务

功能

描述

比对服务

1

多租户功能

支持根据业务用户名进行区分用户的操作

2

比对结果页面展示

展示traceId、业务SQL、比对结果状态、错误原因、SQL类型、源库、目标库、源库SQL、目标库多发SQL、比较内容、记录行数、应用类型、应用名、业务用户名、schema、业务执行时间、比对执行时间、操作详情展示

3

比对结果筛选

支持根据租户名、比对结果状态、TraceID、应用类型、应用名、用户名、SQL类型(增/删/改/查)、报告时间范围等多维度进行筛选

比对规则自定义

1

忽略表字段规则

指定某张表里的某些字段不进行比较。

2

替换规则

用于将数据替换为另一部分内容,用于例如oracle系中数据库系统内时间格式配置不同,对于相同日期的展示格式不同,可对一侧格式进行替换拉起后比较时间的一致性。

3

忽略大小写规则

用于某些跨系数据库比较时,底层存储规则大小写不一致,配置后可忽略大小写对数据比对的影响。

4

精度截取规则

将数值小数部分精确到指定的位数(四舍五入),该规则用于保证数值精度在特定应用场景下的一致性和准确性。

5

字符串截取规则

从输入字符串中截取指定长度的子串。

6

布尔转数字规则

将true转成1,将false转成0,例如mysql系和pg系,bool类型比较即存在该情况。

7

时间戳转字符串规则

将数值类型的时间戳(通常为毫秒数)转换为格式化的日期字符串。

8

支持比对语句规则配置

可配置租户级别多库比较SQL类型需支持哪些类别,忽略哪些类别(包括insert、update、delete、select、merge)

其他特色功能

1

支持全表同步

目标库与源库的表数据不一致,支持全表同步。

2

支持钉钉消息推送

在发生比对失败的时候,发送钉钉消息。

2.8.1. 比对服务

注意

  • 推荐使用 Chrome 浏览器

2.8.1.1. 比对结果页面展示

登录系统后,进入左侧菜单【多发比对】-【多发比对报告】,即可查看比对报告列表界面,比对报告可以基于租户名、比对报告状态、TraceId、应用类型、应用名、用户名、报告生成时间等条件进行筛选。

../_images/%E6%AF%94%E5%AF%B9%E6%8A%A5%E5%91%8A%E5%88%97%E8%A1%A8.png

点击每个比对报告右侧的 详情 链接即可进入比对报告详情界面:

../_images/%E6%AF%94%E5%AF%B9%E6%8A%A5%E5%91%8A%E8%AF%A6%E6%83%85.png

特别注意

  • 比对详情界面展示的表名称在多表操作时会包含所有涉及的表,无法直接看出表与列的关系,需要结合多发查询SQL来明确列字段具体来自哪张表中。

  • 为了列表页面的查询效率,比对结果页面的分页总数与列表是分开查询的,当您点击具体页码切换分页时,分页总数是不会进行更新的;如果您发现分页总数已不准确,需要刷新分页总数时,可点击右下角的刷新按钮,来刷新分页总数。

  • 比对规则下拉列表租户名、应用名、用户名数据量在10000以内时可快速显示,下拉列表数据持续变大时显示会变慢。

  • 比对规则下拉列表租户名、应用名、用户名中的数据每隔一分钟刷新,比对报告中如果出现新的租户名、应用名、用户名需要等待1分钟定时刷新后才会显示在下拉列表中。

点击历史报告刷新时,会根据过滤条件筛选出所有满足条件的报告进行重新刷新生成,确认重新刷新后会删除现有报告并重新生成报告。

特别注意

  • 触发历史报告刷新后,在旧的报告记录上进行详情查看可能会失败,原因是重新生成报告后旧报告数据库已经删除了,因此需要等历史报告刷新完毕后重新查询再进行详情查看。

2.8.1.2. 比对报告列表头支持自定义配置和排序

进入比对报告页面后,在第一列的上方存在一个圆形配置按钮,该按钮即为比对报告列表头配置入口,如下所示:

../_images/column_config_1.png

点击按钮后即可进入配置界面,比对报告列表头配置可基于【租户名+用户名】配置,默认显示全部列信息,隐藏表头Tab表示哪些表头是隐藏不显示的,显示表头Tab表示哪些表头是需要在比对报告列表中显示的, 可以通过操作按钮 <【部分左移】 <<【全部左移】 >【部分右移】 >>【全部右移】在两个Tab之间调整需要显示的表头信息,可以通过拖拽的方式调整Tab中的表头排序,调整完毕后点击确认即可保存,保存完成后即可使用该列配置,如下所示:

../_images/column_config_2.png

注意

  • 该功能在 25.3.2 添加,涉及到增量SQL脚本,非首次安装时,需要参考比对服务部署章节进行升级。

  • 比对报告列表头配置租户名不允许使用全部,用户名不允许使用全部,且租户名、用户名、状态列不可取消,操作列默认保留在表格尾部。

  • 重置操作会将显示列表头还原为全部显示,需要点击确认后才会保存并生效。

  • 列表头配置调整后,在比对报告列表界面点击查询,列表头配置才会生效。

2.8.2. 比对规则说明

2.8.2.1. 支持多租户隔离

  • 比对规则支持多个租户之间相互隔离,每个租户可以使用自己独立的比对规则。比对规则支持配置基于【列数据类型】、【列名称】、【表名称+列名称】、【表名称+列名称+列数据类型】等多个维度的比对规则。

  • 比对规则应用时基于先精确后模糊的流程,比如【表名称+列名称+列数据类型】>【表名称+列名称】>【列名称】>【列数据类型】,在以上维度中只要在一个维度找到了比对规则,应用了比对规则后便不再进行后续查找。

  • 数据库列值不匹配比对规则时,比对规则执行后还是原始值,比如对于精度截取规则,如果数据库列值不是数值类型,如abc,则规则应用后还是原值abc。

  • 比对规则列表页面中的租户名、表名、列名下拉列表,最大支持10000个不重复的选项值,根据创建时间逆序排列。

  • 界面操作时请注意:新增比对规则界面,比对规则类型更改时,默认会清除上一次和规则绑定的配置值,如替换规则中的【待替换的值、替换后的值】,精度截取规则中的【精度截取值】,字符串截取规则中的【截取长度值】,时间戳转字符串规则中的【格式化字符串】。

  • 比对规则验证界面,验证同一个规则时,默认关闭验证窗口会保留上次输出的待测试列值;只有在切换比对规则后会清空。

  • 比对规则配置表名或表列名时,针对逗号分割的多表场景,规则应用时会基于表名进行排序处理,因此表名 a,c,b 和 c,a,b 都能匹配到 a,b,c 三张表关联的场景,无需重复设置,重复设置时,以后设置的规则为准。

    ../_images/%E6%AF%94%E5%AF%B9%E8%A7%84%E5%88%99%E5%A4%9A%E7%A7%9F%E6%88%B7.png

2.8.2.2. 比对规则列数据类型映射说明

  • 对于定长字符串、变长字符串、大字符串等统一映射为 VARCHAR 类型进行处理,在确保语义一致的同时以规避数据库层及驱动层差异。

  • 对于所有精确数值类型,则统一映射为 DECIMAL 类型进行处理。

  • 对于所有非精确数值类型,则统一映射为 DOUBLE 类型进行处理。

  • 对于日期时间和时间戳类型,则统一映射为 TIMESTAMP 类型进行处理。

  • 其他列类型请参考以下映射关系表进行选择。

  • 数据库列类型统一展示为小写格式,比对规则列类型统一展示为大写格式,以示区分。

数据库列类型

比对规则映射类型

char

VARCHAR

nchar

VARCHAR

bpchar

VARCHAR

varchar

VARCHAR

varchar2

VARCHAR

nvarchar2

VARCHAR

long

VARCHAR

tinytext

VARCHAR

text

VARCHAR

mediumtext

VARCHAR

longtext

VARCHAR

json

VARCHAR

number

DECIMAL

numeric

DECIMAL

decimal

DECIMAL

bit

DECIMAL

bool

DECIMAL

boolean

DECIMAL

tinyint

DECIMAL

smallint

DECIMAL

int

DECIMAL

integer

DECIMAL

mediumint

DECIMAL

bigint

DECIMAL

int1

DECIMAL

int2

DECIMAL

int4

DECIMAL

int8

DECIMAL

serial

DECIMAL

bigserial

DECIMAL

float

DOUBLE

double

DOUBLE

binary_float

DOUBLE

binary_double

DOUBLE

real

DOUBLE

float4

DOUBLE

float8

DOUBLE

double precision

DOUBLE

timestamp

TIMESTAMP

timestamp with time zone

TIMESTAMP

datetime with time zone

TIMESTAMP

timestamptz

TIMESTAMP

datetime

TIMESTAMP

date

DATE

time

TIME

blob

BLOB

tinyblob

BLOB

mediumblob

BLOB

longblob

BLOB

clob

CLOB

nclob

CLOB

binary

BINARY

raw

BINARY

bytea

BINARY

varbinary

BINARY

其他所有非以上列类型

OTHER

2.8.2.3. 忽略表列规则

  • 忽略表列规则针对单个表列配置,支持【表名称】、【表名称:*】、【*:列名称】、【表名称:列名称】几种模式,忽略表列规则匹配时不考虑列数据类型,只要匹配该规则,即为当前列值比对成功,将不再应用其他比对规则。

  • 忽略表列规则多个表列配置之间可使用 ; 分割配置,多个列名称之间可通过 , 分割配置,表列名之间使用 : 分割配置,因此这几个分割符不可作为表列名中的一部分。

  • 忽略表列规则典型应用于基于系统时间生成的时间戳,如create_time、update_time等数据列。

  • 忽略表列规则在进行规则测试时,不考虑列值是什么,只要匹配规则,规则应用后列值一直为true。

  • 忽略表列规则中的【比对报告展示】选项用于不需要生成比对报告的场景,当源库或目标库查询结果命中至少一个忽略表列规则且比对报告展示不勾选,即使其他的忽略表列规则同时命中并勾选了比对报告展示,比对报告也不生成,需谨慎使用。

  • 忽略表列规则仅支持租户名、比对规则类型过滤,表列名不支持筛选。

  • 表列名配置出现重叠时,比对报告展示值以后创建的为准,例如 a:c[展示比对报告] a:c,b[不展示比对报告],针对表 a 的 c 列配置,最终为不展示比对报告。

    ../_images/%E5%BF%BD%E7%95%A5%E8%A1%A8%E5%88%97%E8%A7%84%E5%88%99.png

2.8.2.4. 布尔转数字规则

  • 布尔转数字规则统一将boolean类型中的true转换为1,false转换为0,再进行后续的比对。

  • 布尔转数字规则典型应用于boolean类型在不同数据库中表现形式不一样的场景,MySQL数据库存储时为boolean值,Oracle数据库存储时为整数值。

    ../_images/%E5%B8%83%E5%B0%94%E8%BD%AC%E6%95%B0%E5%AD%97%E8%A7%84%E5%88%99.png

2.8.2.5. 时间戳转字符串规则

  • 时间戳转字符串规则用于将时间戳类型统一转换为字符串后再进行比对,默认转换格式为 yyyy-MM-dd HH:mm:ss。

  • 时间戳转字符串规则典型用于日期时间类型在不同的数据库中行为不一致的问题,数据库驱动序列化后可能是java.util.Date、java.sql.Date、java.sql.Timestamp、java.util.LocalDateTime等不同类型。

  • 配置的格式化字符串长度等于10时,如 yyyy-MM-dd,规则应用时会自动在尾部拼接字符串 00:00:00。

  • 格式化字符串解析依赖于 JDK java.time.format.DateTimeFormatter#ofPattern(java.lang.String) 方法,比对服务本身不做特殊验证,如格式化字符串不包含格式化符号时,也能转换成功,如格式化字符串 123,在应用规则后列值也是 123。

    ../_images/%E6%97%B6%E9%97%B4%E6%88%B3%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%A7%84%E5%88%99.png

2.8.2.6. 精度截取规则

  • 精度截取规则用于将浮点数的精度截取到指定的位数,以忽略浮点数处理在不同数据库中的精度差异。

  • 精度截取规则典型应用于浮点数函数计算,如 expr、sqrt、ceil、floor、round 等数学函数。

  • 对于待测试的数值型列值精度小于配置的截取精度值时,默认尾部填充0。

    ../_images/%E7%B2%BE%E5%BA%A6%E6%88%AA%E5%8F%96%E8%A7%84%E5%88%99.png

2.8.2.7. 字符串截取规则

  • 字符串截取规则用于将字符串截取到指定的长度,以解决字符串处理在不同数据库中的差异。

  • 对于待测试的列值长度小于配置的截取长度值时,默认返回原始列值。

    ../_images/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%88%AA%E5%8F%96%E8%A7%84%E5%88%99.png

2.8.2.8. 替换规则

  • 替换规则用于将字符串中的指定子字符串替换为用户自定义的子字符串,以解决字符串处理在不同数据库中的差异。

  • 替换规则典型应用于星期处理,如 MySQL 的 WEEKDAY() 返回 0-6,0 代表星期一;DM 中 TO_CHAR(date, ‘D’) 返回的星期值与 Oracle 一致,1 代表星期日,7 代表星期六。

  • 替换规则在界面显示时,被替换值和目标值之间使用§¢£§特殊符号分割,该特殊符号不可用于待替换值和目标值,可能导致结果错误。

    ../_images/%E6%9B%BF%E6%8D%A2%E8%A7%84%E5%88%99.png

2.8.2.9. 忽略大小写规则

  • 忽略大小写规则用于将字符串规范化为小写格式后进行比对,忽略字符串大小写在不同数据库中的差异性。

  • 忽略大小写规则典型应用于系统表列信息查询,如Oracle查询出的表列名称默认为大写,而Postgresql查询出的表列名称默认为小写。

    ../_images/%E5%BF%BD%E7%95%A5%E5%A4%A7%E5%B0%8F%E5%86%99%E8%A7%84%E5%88%99.png

2.8.2.9.1. 指定表列规则

  • 指定表列规则用于限定比对报告的生成范围,如果查询结果集中的表和列至少一个匹配指定表列规则,则比对报告才会生成;当设置了指定表列规则,且查询结果集的表列信息无法匹配到指定表列规则,则比对报告不生成,需谨慎使用。

  • 指定表列规则匹配时,在进行数据比对时,仅会比对指定表列范围内的查询结果,未命中指定表列规则的查询列值不进行比对,且比对提示为【指定表列规则未命中不进行数据比对】。

  • 如果配置了指定表列规则,则不应用忽略规则中的比对报告显式功能,但是不影响在数据比对时应用忽略规则。

  • 指定表列规则仅支持租户名、比对规则类型过滤,表列名不支持筛选。

    ../_images/%E6%8C%87%E5%AE%9A%E8%A1%A8%E5%88%97%E8%A7%84%E5%88%99.png

2.8.2.9.2. COUNT差异数据忽略查询规则

  • COUNT差异数据忽略查询规则是租户级别的比对规则,对于一个业务操作中的所有SQL,这些SQL的多发查询结果具有相同的traceId,如果存在count(xx)查询且结果为0的SQL,则对于和该SQL具有相同表名的所有查询SQL都不进行比对,适用于先查询count后查询详情,且参与多发比对的某个数据库无数据的场景下使用,主要用于解决数据不一致时的多发比对问题。

  • 规则测试中,由于是租户级别的规则,如果该租户存在此规则,则返回true;如果租户名不匹配,则返回false,不涉及表列值应用。

    ../_images/COUNT%E5%B7%AE%E5%BC%82%E6%95%B0%E6%8D%AE%E5%BF%BD%E7%95%A5%E6%9F%A5%E8%AF%A2%E8%A7%84%E5%88%99.png

2.8.2.10. 比对规则在线验证

  • 比对规则支持在线验证,可在新增规则时先确认下规则的执行效果,规则生效值即为比对规则应用后的列值。

  • 比对规则应用只在数据比对时生效,实际展示比对报告时还是显示原始列值。

以忽略表列规则为例,比对规则匹配时,无论列值是什么,都以true进行对待。

../_images/%E6%AF%94%E5%AF%B9%E8%A7%84%E5%88%99%E5%8C%B9%E9%85%8D.png

以忽略表列规则为例,比对规则不匹配时【此处为列名不匹配】,则返回原始列值。

../_images/%E6%AF%94%E5%AF%B9%E8%A7%84%E5%88%99%E4%B8%8D%E5%8C%B9%E9%85%8D.png

2.8.2.11. 列忽略规则快速添加

  • 比对详情页面支持一键新增列忽略规则,规则新增成功后,将在下次执行比对时生效。忽略该列按钮将在首次点击后置灰。

    ../_images/%E5%BF%BD%E7%95%A5%E8%AF%A5%E5%88%97.png
  • 新增忽略规则成功后,将显示在比对数据规则列表中。

    ../_images/%E5%BF%BD%E7%95%A5%E8%A7%84%E5%88%99%E6%98%BE%E7%A4%BA.png

2.8.3. 比对白名单

2.8.3.1. 比对白名单配置页面

  • 比对白名单作用:通过租户形式配置的SQL操作类型在多发时才会进行数据比对,没有勾选的以及不在范围内的SQL操作类型将不进行数据比对。未配置的租户则默认全部比对。

登录系统后,进入左侧菜单【多发比对】-【比对白名单】,即可查看现有的租户白名单配置列表:可以新增、修改、删除白名单配置;查询基于租户名、源库类型进行筛选。

../_images/%E6%AF%94%E5%AF%B9%E7%99%BD%E5%90%8D%E5%8D%95.png

点击新增按钮,进入新增页面:

../_images/%E6%96%B0%E5%A2%9E%E6%AF%94%E5%AF%B9%E7%99%BD%E5%90%8D%E5%8D%95.png

点击编辑按钮,进入修改页面:

../_images/%E4%BF%AE%E6%94%B9%E6%AF%94%E5%AF%B9%E7%99%BD%E5%90%8D%E5%8D%95.png

点击删除按钮,进行删除操作:

../_images/%E5%88%A0%E9%99%A4%E6%AF%94%E5%AF%B9%E7%99%BD%E5%90%8D%E5%8D%95.png

举例:autotest97租户配置白名单后,配置了忽略DELETE操作类型,发起多发比对后DELETE操作类型SQL将不进行数据比对,同时比对报告界面中会显示状态为操作类型忽略比对:

../_images/%E6%93%8D%E4%BD%9C%E7%B1%BB%E5%9E%8B%E5%BF%BD%E7%95%A5%E6%AF%94%E5%AF%B9%E9%85%8D%E7%BD%AE.png ../_images/%E6%93%8D%E4%BD%9C%E7%B1%BB%E5%9E%8B%E5%BF%BD%E7%95%A5%E6%AF%94%E5%AF%B9%E6%8A%A5%E5%91%8A.png

警告

  • 租户名称支持大小写字母,数字,下划线。暂不支持中文、特殊符号,不支持有空格,不支持 $SYS-ALL$ 和 全部(该标记为HUI前端页面下拉框元素对应的全部标记,不可用于租户名);

  • 租户名必须唯一,不允许重复;

  • 如果租户配置了白名单没有勾选的操作类型以及不在范围内的SQL操作类型将不进行数据比对,同时详情页不展示,处于置灰状态;

  • MERGE操作类型为预留的操作类型;

  • 白名单配置过程中有发起的多发比对,多个库可能存在有些过滤有些没过滤。因此以白名单配置成功后发起的多发比对为准;

  • 比对报告界面的操作类型忽略比对是在比对的时候改的状态,前置步骤出错那显示的还是前置步骤的状态,比如:解析失败、业务SQL执行失败;

  • 【比对报告(未选中的操作类型)是否展示】选项仅针对不勾选的操作类型生效,当勾选是否展示时,未勾选的操作类型会生成比对报告;当不勾选是否展示时,未勾选的操作类型不生成比对报告,需谨慎使用。

2.8.4. 全库数据同步

2.8.4.1. 全库数据同步页面

  • 业务在开展多发比对服务的第一步,需要确保源库、目标库的数据是一致的。假如数据不一致,会导致比对过程出现异常。所以,需要在界面上提供一个同步工具,供测试人员进行使用。。

  • 增加数据库全库同步页面,确保用户可以进行手动同步,解决数据库同步的难题。。

登录系统后,进入左侧菜单【多发比对】-【全库数据同步】,即可查看现有的全库数据同步列表:可以新增、修改、删除以及执行同步;查询基于源库和目标库进行筛选。

../_images/%E5%85%A8%E5%BA%93%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5%E9%A1%B5%E9%9D%A2.jpg

点击新增或者修改按钮,进入新增修改全库数据同步页面:

../_images/%E6%96%B0%E5%A2%9E%E6%88%96%E8%80%85%E4%BF%AE%E6%94%B9%E5%85%A8%E5%BA%93%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5%E4%BB%BB%E5%8A%A1.jpg

不论新增还是修改,均需要测试源库或者目标库可以连通。

点击删除按钮,进行删除操作:

../_images/%E5%88%A0%E9%99%A4%E5%85%A8%E5%BA%93%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5%E4%BB%BB%E5%8A%A1.jpg

点击同步按钮,进行全库数据同步操作:

备注

同步数据前,需完成以下准备工作:

  1. 配置环境变量

    在比对服务所在服务器手动配置环境变量 LIGHTDB_ETL_JAR,需指向 lightdb-etl 的 jar 包完整路径( lightdb-etl的下载界面

    示例:export LIGHTDB_ETL_JAR=/data/multiplex/LightDB1.0-comparison-V202502-00-000/lightdb-etl/lightdb-etl-25.1.jar

  2. 放置数据库驱动

在比对服务的 config 目录下放置当前数据迁移所需数据库驱动。

以比对服务工作目录 /data/multiplex/LightDB1.0-comparison-V202502-00-000 为例,可在 /data/multiplex/LightDB1.0-comparison-V202502-00-000/config 中放置以下驱动(lightdb-etl携带):

  • mysql-connector-j-8.0.30.jar

  • gaussdbDriver-3.0.0-htrunk21.jar

  • gdb_mysql-connector-java-5.1.46.57.jar

  1. 配置数据比对规则

    在比对服务的 config 目录下配置数据迁移后的比对规则。

    以比对服务工作目录 /data/multiplex/LightDB1.0-comparison-V202502-00-000 为例,需在 /data/multiplex/LightDB1.0-comparison-V202502-00-000/config 中放置比较规则目录 compareRules

    比较规则目录 compareRules 下比对规则文件如下:

    • Boolean2Number.json

    • ForceIgnore.json

    • ForceReplace.json

    • SubPrecision.json

    • SubString.json

    • Timestamp2String.json

    比对规则参考链接 支持多租户隔离

  2. 增加统一SQL配置文件

    在比对服务的 config 目录下增加统一SQL的配置文件。

    以比对服务工作目录 /data/multiplex/LightDB1.0-comparison-V202502-00-000 为例,需在 /data/multiplex/LightDB1.0-comparison-V202502-00-000/config 中放置配置文件 unisql.conf

    统一sql配置文件参考链接 配置文件

../_images/%E6%89%A7%E8%A1%8C%E5%85%A8%E5%BA%93%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5%E4%BB%BB%E5%8A%A1.jpg

警告

  • 支持的是全库数据同步,使用同步前确认目标库结构与源库兼容,同步过程中先删除目标库数据再迁移源库数据;

  • 全库数据同步任务的名称必须唯一,不允许重复;

点击 数据比对结果HTML 可以弹窗查看数据同步之后的表数据比对详情报告

../_images/%E8%A1%A8%E6%95%B0%E6%8D%AE%E6%AF%94%E5%AF%B9%E6%8A%A5%E5%91%8A.png

问题排查

  1. 数据同步日志路径:{比对服务log目录}/lightdb-etl/{yyyyMMdd_HHmmss_任务Id_计数}。示例:/data/multiplex/LightDB1.0-comparison-V202502-00-000/logs/lightdb-etl/20250929_135931_22_19

  2. 上述路径下的 lightdb-etl.log:同步总日志,可查看具体迁移的表、数据等信息。

  3. 上述路径下的 lightdb-etl-error.log:同步报错汇总日志。

2.8.5. 接口数据比对

2.8.5.1. 功能概述

../_images/interface_compare_sequence_diagram_2026-01-25_23-35-12.png

主要功能如下:

  1. 多环境接口数据比对:支持多发微服务环境(对接Oracle/DM/LightDB等数据库)的HTTP接口响应数据一致性比对。

  2. 差异报告生成:自动平铺JSON属性,识别缺失字段、值差异等问题,生成汇总报告和详情报告。

  3. 钉钉告警推送:比对失败时自动发送Markdown格式告警,包含租户、traceId、差异详情等核心信息。

  4. 前端可视化展示:支持分页查询、多条件筛选、差异树可视化、详情弹窗查看等操作。

2.8.5.2. 准备条件

  1. 环境要求:JDK 8+、Spring Boot 2.x、lightdb数据库(比对服务存储)。

  2. 依赖组件:multiplex-filter.jar、multiplex-driver.jar、sql-convert-runtime-fat.jar、unisql-compare-client.jar

  3. 权限要求:具备数据库建表权限(比对服务需要)、服务部署与重启权限、钉钉机器人配置权限。

2.8.5.3. 接口数据比对页面

功能概述

  1. 筛选查询:支持租户、业务用户名、URL、traceId、源库/目标库、时间范围等11种筛选条件。

  2. 查看汇总报告:分页展示比对结果,包含链路ID、比对状态、执行时间等核心信息。

  3. SQL比对结果:点击 成功 或者 失败 跳转至多发比对页面,携带报告ID、traceId等参数。

  4. 接口比对结果:点击 成功 或者 失败 打开弹窗,在差异一栏点击差异按钮可弹窗展示JSON差异树(差异节点默认展开,支持滚动同步)。

../_images/interface_compare_main_2026-01-26_00-14-58.png ../_images/interface_compare_detail_window_2026-01-26_00-14-58.png

2.8.5.4. 差异树操作

功能概述

  1. 展开/收缩:点击节点前“+/-”按钮展开或收缩子节点。

  2. 差异标识:缺失字段划横线,值差异标红(源库)/绿(目标库)。

../_images/interface_compare_json_tree_2026-01-26_00-14-58.png

2.8.5.5. 接口数据比对失败发送钉钉告警

功能概述

  1. 告警依赖比对配置项multi.dingding.enableNotifyFunc的内容包含interfaceCompare。示例 multi.dingding.enableNotifyFunc=interfaceCompare

  2. 告警触发条件:接口数据比对失败。

  3. 告警消息包含:租户名称、traceId、目标库数量、总差异数、差异汇总、报告跳转链接。

  4. 钉钉告警推送功能,具体参考 支持钉钉消息推送

../_images/dinding_interfaceCompare_message_2026-01-25_23-35-12.png

2.8.5.6. 接口数据规则管理

2.8.5.6.1. 功能概述

接口数据规则管理功能用于配置接口数据比对时的忽略规则,支持按租户、URL 接口、对象等维度设置规则,实现灵活的数据比对控制。

2.8.5.6.2. 访问路径

  • 页面路径:${appName}/em/comparison/interfaceCompareRule.html

  • API 基础路径:/em/comparison/interface/rule

2.8.5.6.3. 主要功能

2.8.5.6.3.1. 规则查询

筛选条件:

  • 租户名:支持下拉选择,默认值为 所有租户

  • 规则类型:固定为“忽略接口数据”

  • URL:接口 URL 关键字筛选

  • 对象:比对对象关键字筛选

操作步骤:

  1. 在筛选区域选择或输入查询条件

  2. 点击【查询】按钮,刷新列表数据

  3. 点击【重置】按钮,清空筛选条件并恢复默认值

../_images/%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE%E8%A7%84%E5%88%99_%E6%9F%A5%E8%AF%A2_2026-03-06_14-16-11.png
2.8.5.6.3.2. 新增忽略规则

操作流程:

  1. 点击【新增】按钮,弹出“新增或修改接口数据规则”窗口

  2. 填写以下必填信息:

    • 租户名称:输入要应用规则的租户名

    • 规则类型:固定为“忽略接口数据”

    • 匹配规则:选择规则的适用范围

      • 接口:仅按 URL 匹配

      • 接口+对象:同时按 URL 和对象匹配

      • 对象:仅按对象匹配

    • URL:当匹配规则包含“接口”时填写,多个 URL 用英文分号 ; 分隔

    • 对象:当匹配规则包含“对象”时填写,多个对象用英文分号 ; 分隔,格式示例:a:b:c

字段格式要求:

  • 支持单个值或多个值(英文分号分隔)

  • 禁止使用中文分号(;)

  • 禁止连续分号(;;)或首尾分号(;aaa、aaa;)

  • 系统会自动去除空格并标准化格式

快捷操作:

  • 【确认并新增】:提交后保持弹窗打开,可继续添加新规则

  • 【确认】:提交后关闭弹窗

../_images/%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE%E8%A7%84%E5%88%99_%E6%96%B0%E5%A2%9E1_2026-03-06_14-16-50.png ../_images/%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE%E8%A7%84%E5%88%99_%E6%96%B0%E5%A2%9E2_2026-03-06_14-16-50.png ../_images/%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE%E8%A7%84%E5%88%99_%E6%96%B0%E5%A2%9E3_2026-03-06_14-16-50.png
2.8.5.6.3.3. 修改规则

操作流程:

  1. 在规则列表中点击目标记录的【修改】按钮

  2. 弹窗中显示当前规则的详细信息

  3. 修改需要调整的字段的值

  4. 点击【确认】保存修改

注意事项:

  • 规则 ID 不可修改(只读显示)

../_images/%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE%E8%A7%84%E5%88%99_%E4%BF%AE%E6%94%B9_2026-03-06_14-18-00.png
2.8.5.6.3.4. 删除规则

操作流程:

  1. 在规则列表中点击目标记录的【删除】按钮

  2. 系统弹出二次确认对话框:“确认要删除该配置项吗?”

  3. 点击【确认】执行删除操作

安全机制:

  • 删除操作需二次确认,防止误删

  • 删除成功后自动刷新列表

../_images/%E6%8E%A5%E5%8F%A3%E6%95%B0%E6%8D%AE%E8%A7%84%E5%88%99_%E5%88%A0%E9%99%A4_2026-03-06_14-18-00.png

2.8.5.6.4. 数据表格

列说明:

列名

说明

备注

id

规则唯一标识

系统自动生成

租户名

适用租户

支持多租户

规则类型

固定为“忽略接口数据”

URL

接口地址

支持通配符 *

对象

比对对象

支持多个对象

操作

【修改】【删除】按钮

行内操作区

2.8.5.6.5. 分页功能

分页选项:

  • 每页条数:10、20、50、100、1000 条

  • 默认条数:50 条

  • 总条数显示:显示当前筛选条件下的总记录数

  • 页码跳转:支持直接输入页码快速跳转

2.8.5.6.6. 自动刷新

刷新机制:

  • 页面右上角提供刷新按钮

  • 支持定时自动刷新,可选间隔:5s、10s、15s、30s、60s、300s

  • 手动点击刷新按钮立即重新加载数据

2.8.5.6.7. API 接口说明

2.8.5.6.7.1. 新增规则
POST /em/comparison/interface/rule/add
Content-Type: application/json

{
  "id": 0,
  "tenantName": "租户名",
  "ruleType": "忽略接口数据",
  "matchingRule": "接口 + 对象",
  "url": "url1;url2",
  "ruleContent": "obj1;obj2"
}
2.8.5.6.7.2. 修改规则
POST /em/comparison/interface/rule/update
Content-Type: application/json

{
  "id": 123,
  "tenantName": "租户名",
  "ruleType": "忽略接口数据",
  "matchingRule": "接口 + 对象",
  "url": "url1;url2",
  "ruleContent": "obj1;obj2"
}
2.8.5.6.7.3. 删除规则
POST /em/comparison/interface/rule/delete/{id}
2.8.5.6.7.4. 分页查询
POST /em/comparison/interface/rule/page?pageNum=1&pageSize=50
Content-Type: application/json

{
  "tenantName": "$SYS-ALL$",
  "ruleType": "忽略接口数据",
  "url": "",
  "ruleContent": ""
}
2.8.5.6.7.5. 获取下拉选项
GET /em/comparison/interface/rule/getDistinctDropDownListValues
2.8.5.6.7.6. 按租户查询规则
POST /em/comparison/interface/rule/rulesByTenant
Content-Type: application/json

{
  "tenantName": "租户名"
}

2.8.5.6.8. 常见错误处理

错误提示

原因

解决方案

URL 格式错误

使用了中文分号或格式不规范

改用英文分号,检查是否有连续分号

对象格式错误

使用了中文分号或格式不规范

改用英文分号,检查是否有连续分号

请检查表单是否填写完整

必填字段未填写

检查所有带红色星号的字段

新增或修改接口数据规则失败

后端服务异常或数据冲突

查看具体错误信息,联系管理员

2.8.5.6.9. 最佳实践建议

  1. 规则命名规范:建议使用有意义的租户名和对象名,便于后续维护

  2. 批量配置:多个 URL 或对象尽量一次性用分号分隔填写,避免重复配置

  3. 定期清理:定期检查并删除不再使用的规则,保持规则库简洁

  4. 测试验证:新增规则后,建议在测试环境验证效果后再应用到生产环境

2.8.5.7. 差异树渲染后的规则动态管理

功能概述

在接口数据比对报告的差异树渲染完成后,用户可以针对当前查看的接口数据,动态添加或删除忽略规则。系统会自动重新生成报告并刷新差异树,实时展示规则应用后的比对结果。

应用场景

  • 接口数据规则参考: 接口数据规则管理

  • 添加忽略规则的场景

    • 发现某些字段差异是无意义的(如时间戳、自增 ID 等)

    • 希望永久忽略某些特定对象字段的差异

    • 需要针对整个接口进行忽略

  • 删除忽略规则的场景

    • 之前配置的规则不再适用

    • 需要恢复某些字段的差异比对

    • 规则配置错误需要修正

操作入口

  1. 打开差异比对弹窗

    1. 在接口数据比对报告列表中,找到目标记录

    2. 点击”差异”列的 “有差异”“无差异” 按钮

    3. 系统弹出 JSON 差异比对窗口,左右两侧分别显示源库和目标库的数据

  2. 识别可操作节点

    差异树中的每个节点右侧可能带有以下图标按钮:

    颜色

    是否必须

    含义

    操作

    金色

    该字段可添加忽略规则

    点击后新增规则

    灰色

    该字段已应用忽略规则

    点击后删除规则

添加忽略规则

  1. 操作步骤(针对对象字段为例)

    • 步骤 1:定位目标字段

      • 在差异树中找到需要忽略的字段节点

      • 该字段必须是 差异节点(值不同、缺失或新增)

      • 确认该字段未被全局规则忽略

    • 步骤 2:点击添加按钮

      示例场景:

      左侧(源库):{"createTime": "2024-01-01"}
      右侧(目标库):{"createTime": "2024-01-02"}
                      ↑
                [金色🔔按钮] ← 点击此处
      
    • 步骤 3:确认规则参数

    • 步骤 4:提交规则

      • 点击【确认】按钮提交规则

      • 系统显示”规则新增成功”提示

    • 步骤 5:等待系统处理

      系统自动执行以下流程(约 3-5 秒):

      ① 新增规则 → ② 刷新规则缓存 → ③ 重新生成报告 → ④ 获取最新详情 → ⑤ 重新渲染差异树
      
    • 步骤 6:验证效果

      • 差异树自动刷新

      • 刚才的字段差异消失(被忽略)

      • 该字段右侧的按钮变为灰色🔔

  2. 对象字段_点击添加规则

../_images/%E5%AF%B9%E8%B1%A1%E5%AD%97%E6%AE%B5_%E7%82%B9%E5%87%BB%E6%B7%BB%E5%8A%A0%E5%BF%BD%E7%95%A5%E8%A7%84%E5%88%99_2026-03-06_10-37-24.png
  1. 对象字段已应用规则_支持点击删除

../_images/%E5%AF%B9%E8%B1%A1%E5%AD%97%E6%AE%B5%E5%B7%B2%E5%BA%94%E7%94%A8%E8%A7%84%E5%88%99_%E6%94%AF%E6%8C%81%E7%82%B9%E5%87%BB%E5%88%A0%E9%99%A4_2026-03-06_10-38-08.png
  1. 忽略整个接口差异

../_images/%E5%BF%BD%E7%95%A5%E6%95%B4%E4%B8%AA%E6%8E%A5%E5%8F%A3%E5%B7%AE%E5%BC%82_2026-03-06_10-29-51.png
  1. 已应用接口级规则,支持点击删除

../_images/%E5%B7%B2%E5%BA%94%E7%94%A8%E6%8E%A5%E5%8F%A3%E7%BA%A7%E8%A7%84%E5%88%99_%E6%94%AF%E6%8C%81%E7%82%B9%E5%87%BB%E5%88%A0%E9%99%A4_2026-03-06_10-28-15.png

删除忽略规则

  1. 操作步骤(针对对象字段为例)

    • 步骤 1:定位已忽略字段

      • 在差异树中找到带有 灰色🔔按钮 的节点

      • 该字段当前被规则忽略,不显示差异

    • 步骤 2:点击删除按钮

      示例场景:

      左侧(源库):{"status": "active"}
      右侧(目标库):{"status": "inactive"}
                      ↑
                [灰色🔔按钮] ← 点击此处
      
    • 步骤 3:确认删除

      系统弹出二次确认框:

      ┌─────────────────────────────┐
      │  确认要删除该忽略规则吗?    │
      │                             │
      │  删除后该字段的差异将重新显示 │
      └─────────────────────────────┘
            【取消】    【确认】
      
    • 步骤 4:等待系统处理

      系统自动执行以下流程:

      ① 删除规则 → ② 刷新规则缓存 → ③ 重新生成报告 → ④ 获取最新详情 → ⑤ 重新渲染差异树
      
    • 步骤 5:验证效果

      • 差异树自动刷新

      • 该字段的差异重新显示

      • 该字段右侧的按钮变为金色🔔

  2. 已应用对象字段规则_删除确认

../_images/%E5%AF%B9%E8%B1%A1%E5%AD%97%E6%AE%B5_%E5%88%A0%E9%99%A4%E7%A1%AE%E8%AE%A4_2026-03-06_10-38-55.png
  1. 已应用接口级规则_删除确认

../_images/%E5%88%A0%E9%99%A4%E7%A1%AE%E8%AE%A4_%E6%8E%A5%E5%8F%A3%E7%BA%A7%E8%A7%84%E5%88%99_2026-03-06_10-28-59.png

规则作用域与生效时机

  1. 规则生效条件

    规则必须同时满足以下条件才会生效:

    ✅ 规则类型 = "忽略接口数据"
    ✅ 当前接口 URL这里是完整匹配,如果是匹配接口或者匹配接口+对象,不支持模糊匹配,示例:/api/user/*
    ✅ 对象字段匹配,这里对象并不是完整路径,配置create_time,则路径a.create_time或者c.d.create_time都匹配
    ✅ 规则创建时间 ≤ 报告比对时间(仅忽略历史报告,不影响未来)
    
  2. 规则作用域

    规则配置

    作用范围

    示例

    租户名=tenantA, URL=/api/user, 对象=name

    仅 tenantA 的/api/user 接口的 name 字段

    精确控制

    租户名=tenantA, URL=*, 对象=name

    tenantA 下的/api/user 接口返回值的name 字段

    全局忽略

  3. 生效时机

    • 新增规则后:立即重新生成报告,新规则即刻生效

    • 删除规则后:立即重新生成报告,原规则即刻失效

    • 查看历史报告:根据规则创建时间与报告比对时间判断是否应用

差异树渲染机制

用户操作(添加/删除规则)
    ↓
前端调用后端 API
    ↓
后端更新规则库
    ↓
前端刷新规则缓存(fetchTenantInterfaceRules)
    ↓
后端重新生成比对报告(regenerateInterfaceReport)
    ↓
前端获取最新详情数据(getDetail)
    ↓
前端重新渲染差异树(rerenderDiffTree)
    ↓
用户看到最新差异结果

常见问题处理

  1. 添加规则后差异未消失

    • 可能原因:

      1. 规则创建时间晚于报告比对时间

      2. URL 或对象字段匹配不精确

    • 解决方案:

      检查清单:

      ☑ 规则.createTime ≤ 报告.compareTime
      ☑ 当前 URL 是否匹配 规则.url
      ☑ 对象字段完全匹配(大小写敏感)
      ☑ 规则类型="忽略接口数据"
      
  2. 删除规则后差异未显示

    • 可能原因:

      1. 存在其他规则仍覆盖该字段

      2. 报告未成功重新生成

      3. 浏览器缓存未刷新

  3. 差异树渲染失败

    • 可能原因:

      1. JSON 数据格式错误

      2. 网络请求超时

      3. 前端 JS 异常

    • 解决方案:

      打开浏览器控制台(F12),检查是否有错误日志

      常见错误及修复:

      • JSON.parse failed → 联系后端检查数据完整性

      • Network Error → 检查网络连接,重试操作

      • Vue Warning → 刷新页面或重新打开差异弹窗

  4. 按钮点击无响应

    • 可能原因:

      1. 按钮处于加载锁定状态(ruleLoadingMap)

      2. 前端事件绑定失败

      3. 后端服务不可用

    • 解决方案:

      1. 等待 3-5 秒,看是否正在处理

      2. 刷新页面后重试

      3. 检查后端服务日志

最佳实践建议

  1. 规则配置策略

    1. 由粗到细:先配置接口级规则,再补充对象级规则

    2. 批量处理:相似字段用分号分隔,如 create_time;update_time;delete_time

    3. 测试验证:先在测试环境验证规则效果,再应用到生产

  2. 规则维护建议

    1. 定期清理:每季度审查一次规则库,删除过期规则

    2. 文档记录:建立规则台账,记录每条规则的业务意义

    3. 监控告警:配置规则变更通知,及时发现异常

  3. 性能优化建议

    1. 避免全量忽略:慎用 接口 级别的忽略规则

    2. 分批操作:大批量规则变更时,分批次提交

    3. 错峰操作:避开业务高峰期进行规则调整

技术实现原理(供参考)

  1. 核心方法调用链

    • 添加规则:

      addInterfaceIgnoreRule()
        ├─ POST /em/comparison/interface/rule/add
        ├─ fetchTenantInterfaceRules()        // 刷新规则缓存
        ├─ regenerateInterfaceReport()        // 重新生成报告
        ├─ getDetail()                        // 获取最新详情
        └─ rerenderDiffTree()                 // 重新渲染差异树
      
    • 删除规则:

      deleteInterfaceIgnoreRule()
        ├─ POST /em/comparison/interface/rule/delete/{id}
        ├─ fetchTenantInterfaceRules()        // 刷新规则缓存
        ├─ regenerateInterfaceReport()        // 重新生成报告
        ├─ getDetail()                        // 获取最新详情
        └─ rerenderDiffTree()                 // 重新渲染差异树
      
  2. 差异树渲染流程

    renderDiffContent(json1, json2, diff)
      ├─ fetchTenantInterfaceRules()        // 拉取当前租户规则
      ├─ collectAllPaths()                  // 收集所有路径
      ├─ diffObjects()                      // 对比对象差异
      ├─ buildTreeNode()                    // 构建树节点
      │   ├─ getFieldIgnoredRule()          // 判断字段是否被忽略
      │   ├─ renderIgnoreButton()           // 渲染忽略按钮
      │   └─ 递归构建子节点
      └─ 挂载到 DOM
    

相关 API 接口

接口路径

方法

说明

/em/comparison/interface/rule/add

POST

新增忽略规则

/em/comparison/interface/rule/delete/{id}

POST

删除忽略规则

/em/comparison/interface/rule/rulesByTenant

POST

获取租户下的规则

/em/comparison/interface/rule/cache/refresh

GET

手动刷新缓存

/em/comparison/interface/regenerate?traceId={id}

POST

重新生成报告

2.8.5.8. 差异统计常见问题说明

渲染的差异树(目标库属性为0,属性值差异场景):

../_images/%E6%B8%B2%E6%9F%93%E7%9A%84%E5%B7%AE%E5%BC%82%E6%A0%91_%E7%9B%AE%E6%A0%87%E5%BA%93%E5%B1%9E%E6%80%A7%E4%B8%BA0_%E5%B1%9E%E6%80%A7%E5%80%BC%E5%B7%AE%E5%BC%82_2026-02-09_11-54-30.png

问题1:属性值差异是否包含目标库缺失的属性?

核心结论:不包含

属性值差异与目标库缺失属性为完全独立、互不包含的两类统计维度:

  • 目标库缺失属性

    • 仅统计目标库完全不存在该属性的场景。

    • 示例:源库存在 cpu.sections 属性,目标库无该字段。

  • 属性值差异

    • 仅统计源库与目标库均存在该属性,但取值不一致的场景。

    • 示例:源库与目标库均有 cpu.sections,源库为有效数组,目标库为空值,即在目标库 cpu.sections 属性值为null。

简单理解:

  • 缺失属性:判断 是否存在该属性

  • 属性值差异:判断 属性均存在时,取值是否相同

问题2:为何目标库缺失属性显示 0 项,但属性值差异有内容?

核心原因

目标库相关属性存在但值为 null / 空,并非属性完全不存在,因此: - 不计入目标库缺失属性统计 - 会被正常计入属性值差异统计

数据对比示例

cpu.sections 为例,参考下方json示例:

  • 源库:cpu.sections 为有效数组,存在业务数据

  • 目标库:cpu.sections 属性存在,但取值为 null

最终统计表现:

  • 目标库存在该属性 → 目标库缺失属性 = 0

  • 源库与目标库属性值不一致 → 属性值差异展示该条记录

源库json

{
    "status": 200,
    "success": true,
    "errorCode": null,
    "errorInfo": null,
    "data": {
        "statistics": {
            "cpu": {
                "usedRatio": 12.2,
                "sections": [
                    {
                        "count": 1,
                        "range": "0",
                        "monitorKeys": [
                            "aba7e16df7cd4fc8b3912c71eecec406"
                        ]
                    }
                ],
                "cpuTotal": 16
            },
            "memory": {
                "total": 31.4,
                "used": 6.95,
                "usedRatio": 22.14,
                "sections": [
                    {
                        "count": 1,
                        "range": "1",
                        "monitorKeys": [
                            "aba7e16df7cd4fc8b3912c71eecec406"
                        ]
                    }
                ]
            },
            "storage": {
                "total": 0,
                "used": 0,
                "usedRatio": 67,
                "sections": [
                    {
                        "count": 1,
                        "range": "3",
                        "monitorKeys": [
                            "aba7e16df7cd4fc8b3912c71eecec406"
                        ]
                    }
                ]
            },
            "netsource": {
                "outBps": 158.1,
                "inBps": 131.5
            }
        }
    },
    "id": null,
    "active": null,
    "expression": null,
    "error_info": null,
    "error_Code": null
}

目标库json

{
    "status": 200,
    "success": true,
    "errorCode": null,
    "errorInfo": null,
    "data": {
        "statistics": {
            "cpu": {
                "usedRatio": 0,
                "sections": null,
                "cpuTotal": 0
            },
            "memory": {
                "total": 0,
                "used": 0,
                "usedRatio": 0,
                "sections": null
            },
            "storage": {
                "total": 0,
                "used": 0,
                "usedRatio": 0,
                "sections": null
            },
            "netsource": {
                "outBps": 0,
                "inBps": 0
            }
        }
    },
    "id": null,
    "active": null,
    "expression": null,
    "error_info": null,
    "error_Code": null
}

问题3:系统差异判定逻辑:

  1. 先校验目标库是否存在该属性

    • 不存在 → 归类为 目标库缺失属性

    • 存在 → 进入属性值对比环节

  2. 对比属性取值

    • 值相同 → 无差异

    • 值不同 → 归类为 属性值差异

问题4:关键总结

  1. 独立性:
    • 属性值差异与目标库缺失属性为独立统计项,互不包含、互不叠加。

  2. 常见疑问解答:
    • 目标库缺失属性为 0 但属性值差异有数据:原因为目标库属性存在但值为空,而非属性不存在。

  3. 系统判定缺失属性唯一标准:
    • 目标库完全无该属性,而非属性值为空(null/空串/空数组)。

2.8.6. 系统工具

2.8.6.1. 比对报告清理

  • 支持比对报告按照租户名、用户名、报告时间进行筛选并清理,如下所示:

../_images/deleteCompareReport.png

警告

  • 该功能在 25.3.2 添加,涉及到增量SQL脚本,非首次安装时,需要参考比对服务部署章节进行升级。

  • 租户名和用户名不能使用全部,报告时间可按需选择,清理操作会将比对报告永久删除,清理前请仔细核对并确认。

  • 操作成功后,租户名和用户名将还原为全部,报告时间保持不变。

2.8.6.2. 系统版本号

  • 可查看当前部署多发比对系统的版本号信息,如下所示。

../_images/systemVersion.png

注意

  • 该功能在 25.3.2 添加,涉及到增量SQL脚本,非首次安装时,需要参考比对服务部署章节进行升级。

2.8.7. 其他特色功能

2.8.7.1. 支持全表同步

  1. 功能概述

    • 全表同步功能用于将比对失败的表从源库进行全量或条件同步至目标库。同步完成后,会自动执行数据比对。该功能支持单表和多表批量同步,允许设定过滤条件以同步符合要求的数据,并针对不同的数据库类型提供适配的同步策略。

  2. 权限要求

    • 运行比对服务的用户需具备ETL工作目录({比对服务安装目录}/logs/lightdb-etl)的读写权限,比对服务依赖etl实现表数据迁移。

    • etl访问源库和目标库,配置的数据用户需要至少具备源库的SELECT权限、目标库的INSERT/UPDATE/DELETE权限

  3. 数据库兼容性:

源库

目标库

备注

oracle19c

dm8

oracle19c

gaussdb_oracle

PG系,需配置Schema

oracle19c

gaussdb_pg

PG系,需配置Schema

oracle19c

ocean_base_oracle

oracle19c

tdsql_pg_oracle

PG系,需配置Schema

mysql8/mariadb10

gaussdb500_oracle

PG系,需配置Schema

mysql8/mariadb10

lightdb_mysql

PG系,需配置Schema

mysql8/mariadb10

ob_mysql

mysql8/mariadb10

tdsql_mysql

mysql8/mariadb10

gaussdb_oracle

PG系,需配置Schema

  1. 操作步骤

4.1 触发全表同步

  • 在比对报告页面,针对比对失败的表点击「全表数据同步」按钮;

  • 若为多表同步:
    • 在弹窗中勾选需同步的表(至少选择1张,表名区分大小写,与数据库中一致);

    • 若目标库为PG系(LightDB_MySQL、GaussDB_Oracle、GaussDB500_Oracle等):手动输入目标库Schema(默认值 public,支持自定义,不可包含特殊字符);

    • (可选)配置表的筛选条件:在“where条件”输入框填写筛选规则(如 id > 100 AND create_time < '2025-01-01',需符合源库SQL语法);

  • 点击「确认同步」,页面弹出“同步等待框”(不可关闭页面,超时时间默认30分钟),等待后端返回同步结果。

4.2 同步结果查看

  • 同步成功:提示 数据同步完成,数据比对一致,可查看同步的表、数据量、比对结果;

  • 同步完成但比对不一致:提示 数据同步已完成,数据比对不一致,可查看具体差异行数、快速失败提示(不一致行数超过阈值时触发);

  • 同步失败:提示具体错误信息(如 任务正在执行中,请勿重复提交, 端口占用 等)。

4.3 依赖etl实现表数据同步

  • 在比对服务所在服务器配置etl的环境变量LIGHTDB_ETL_JAR,环境变量LIGHTDB_ETL_JAR示例数据/data/lightdb/liangdong30629/comparison-V202503-02-000/lightdb-etl/lightdb-etl-25.4.0.3.jar

  • 在比对服务一键部署章节,包含了设置etl的环境变量LIGHTDB_ETL_JAR,具体参考 一键部署方式(推荐)

  • 注意,需要将etl安装目录下的config目录中的内容(驱动包,*.jar,例如gdb_mysql-connector-java-5.1.46.57.jar)拷贝到比对服务家目录下的config目录下

  1. 日志说明

5.1 日志目录

ETL工作目录: {比对服务安装目录}/logs/lightdb-etl/{时间戳_traceId_计数器}(例:20251017_102030_e123456_1),系统会自动清理7天前的过期目录,避免磁盘占用。

5.2 日志文件说明

日志文件

内容说明

lightdb-etl.log

同步总日志:记录同步的表清单、数据量、同步耗时、执行步骤

lightdb-etl-error.log

错误汇总日志:按时间戳记录同步异常,比如连接失败、SQL语法错误、权限不足等

result.info

同步结果核心文件:记录同步是否完成、基础结果信息

table_data_compare_*.html

可视化比对报告:浏览器直接打开,查看字段级数据差异、比对规则应用情况

  1. 问题排查

6.1 常见错误场景及解决方案

错误提示

可能原因

解决方案

任务正在执行中,请勿重复提交

同一表/任务标识的同步任务未结束

等待当前任务完成后重试,或联系管理员查看RUNNING_SYNC_TASKS状态

找不到随机可用端口

服务器端口被占满

释放无用端口,或重启比对服务

源库/目标库连接信息无效

数据库连接串/账号密码错误

核对源库/目标库的JDBC连接信息,测试网络连通性

数据同步完成,数据比对不一致

字段值不匹配/比对规则触发

查看html比对报告,确认差异字段;核对比对白名单/忽略规则配置

ETL配置文件创建失败

目录权限不足/路径非法

检查ETL工作目录权限,确保路径无非法字符

环境校验失败:LIGHTDB_ETL_JAR

环境变量未配置/路径错误

重新配置环境变量,验证jar包路径存在且可读

6.2 高级排查步骤

  1. 查看lightdb-etl-error.log获取详细报错堆栈;

  2. 检查ETL配置文件(application_${时间戳}.properties)核对源/目标库配置;

  3. 验证LightDB-ETL jar包版本与比对服务兼容性;

  4. 确认源库where条件语法正确性(同步筛选条件)。

  1. 注意事项

    1. 数据备份:同步前建议备份目标库对应表数据,避免同步过程中数据覆盖;

    2. 业务影响:同步期间目标库表会写入数据,建议在业务低峰期执行;

    3. 批量同步:多表同步建议分批执行,避免占用过多数据库资源;

    4. 日志保留:系统自动清理7天前的ETL目录,如需保留日志请手动备份。

  2. 术语解释

    • PG系目标库:基于PostgreSQL内核的目标库(LightDB_MySQL/GaussDB_Oracle/GaussDB500_Oracle等);

    • TraceID:链路ID,用于追踪单次同步任务的全流程日志;

    • Schema:数据库模式,区分不同的数据库对象集合(PG系目标库必填);

    • 快速失败:数据比对时不一致行数超过阈值,停止比对以提升效率;

    • ETL工作目录:存储同步配置、日志、比对结果的临时目录(自动清理过期数据)。

  3. 截图说明:

在比对报告中,可点击 全表数据同步 将对比失败的表进行表数据的全量同步。详细操作步骤如下:

../_images/%E5%85%A8%E9%87%8F%E5%90%8C%E6%AD%A5%E6%AF%94%E5%AF%B9%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%A1%A8.png ../_images/%E6%88%90%E5%8A%9F%E5%85%A8%E9%87%8F%E5%90%8C%E6%AD%A5%E6%AF%94%E5%AF%B9%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%A1%A8.png

比对失败,多表数据同步,可选择同步的表,至少选择一个

../_images/%E5%A4%9A%E8%A1%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5%E5%BC%B9%E7%AA%97__2026-01-30_17-31-22.png

目标库是pg 系,举例:lightdb_mysql,gaussdb_oracle,gaussdb500_oracle,在确认数据同步之前,需要手工输入目标库 schema

多表数据同步,选择表之后,点击确认同步后,同步等待后端返回本次迁移结果(先同步数据再比对数据),具体如下图:

../_images/%E5%A4%9A%E8%A1%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5_%E5%90%8C%E6%AD%A5%E7%AD%89%E5%BE%85%E6%A1%86_2025-10-17_09-51-02.png

2.8.7.2. 支持钉钉消息推送

按照如下操作步骤添加机器人,第一步:打开群设置

../_images/%E6%9C%BA%E5%99%A8%E4%BA%BA1.png

第二步:进入机器人

../_images/%E6%9C%BA%E5%99%A8%E4%BA%BA2.png

第三步:添加机器人

../_images/%E6%9C%BA%E5%99%A8%E4%BA%BA3.png

第四步:选择自定义机器人

../_images/%E6%9C%BA%E5%99%A8%E4%BA%BA4.png

第五步:安全设置选择加签

../_images/%E6%9C%BA%E5%99%A8%E4%BA%BA5.png

第六步:使用webhook方式

../_images/%E6%9C%BA%E5%99%A8%E4%BA%BA6.png

第七步:获取accessToken和secret配置到比对服务中

../_images/%E6%9C%BA%E5%99%A8%E4%BA%BA7.png

比对配置项如下

  1. multi.dingding.accessToken 配置为钉钉机器人Webhook的accessToken,在Webhook的连接参数上获取。

  2. multi.dingding.secret 配置为钉钉机器人的secret,使用加签复选框下面的密钥。

  3. multi.dingding.url 配置为比对服务的访问地址。

  4. multi.dingding.enableNotifyFunc 取值范围sqlCompare,interfaceCompare,分别表示(sql)数据比对失败和接口数据比对失败

当配置钉钉机器人后,(sql)数据比对失败(multi.dingding.enableNotifyFunc的内容包含sqlCompare),会给钉钉机器人发送消息,如下图:

../_images/dingding_message.png

当配置钉钉机器人后,接口数据比对失败(multi.dingding.enableNotifyFunc的内容包含interfaceCompare),会给钉钉机器人发送消息,如下图:

../_images/dinding_interfaceCompare_message_2026-01-25_23-35-12.png

2.8.7.3. 详情页面支持横向、竖向展示可配置

功能概述

  1. 实现比对详情表格在竖向展示(默认,数据库表格式) 和横向展示(列转行格式) 间的切换,

  2. 保留差异样式、忽略列、复制等核心交互,适配不同数据查看场景。

比对详情表格在竖向展示(默认,数据库表格式)

../_images/compare_report_detail_table_vertical_2026-01-27_15-51-37.png

横向展示(列转行格式)

../_images/compare_report_detail_table_horizontal_2026-01-27_15-51-37.png

2.8.7.4. UUID同步服务集成到多发比对页面

  1. 界面

    ../_images/uuid_config.png

    该处只能进行保存或修改,不能进行删除

  2. 时序图

    ../_images/uuid%E9%9B%86%E6%88%90%E5%88%B0%E6%AF%94%E5%AF%B9%E6%9C%8D%E5%8A%A1%E6%97%B6%E5%BA%8F%E5%9B%BE_2026-02-25_05-42-06.png
  1. 接口-新增/覆盖配置,接口包含参数合法性校验,仅支持 agent.tablecols 合法参数KEY,保存配置时按表维度合并新旧 param_value ,同表配置覆盖、新表配置新增,避免重复配置与数据丢失。

http://ip:port/em/api/config/save

2.1 请求方式POST

2.2 Content-Type为application/json;charset=UTF-8

2.3 接口请求参数

参数名

类型

是否必须

说明

示例

tenantName

String

租户名称

see

paramKey

String

配置项的key,目前仅支持agent.tablecols表示表的列用于uuid同步

paramValue

String

配置项内容,目前仅支持表的列,多个表之间;分隔,表与列之间:分隔,表的多个列之间,分隔

tb1:col1;tb2:col1,col3;tb3:col1,col3;

2.4 接口返回参数

参数名

类型

是否必须

说明

取值范围

示例

code

Integer

状态码,0表示成功,非0表示异常

0

message

String

信息描述

新增成功

2.5 请求示例成功

{
  "tenantName": "See",
  "paramKey": "agent.tablecols",
  "paramValue": "tb1:col1;tb2:col1,col3;tb3:col1,col3;"
}

2.6 返回示例

{
    "count": 0,
    "code": 0,
    "data": null,
    "message": "新增成功"
}