创建数据一致性校验

最近更新时间:2025-12-11 11:29:42

我的收藏

操作场景

数据一致性校验,即 DTS 对数据同步的源库和目标库的表数据进行对比,并给出对比结果和不一致详情,辅助用户快速对同步结果进行验证。数据一致性校验任务是独立进行的,不会影响源数据库的正常业务,也不会影响 DTS 的任务。
说明:
一致性校验仅作为辅助的数据验证手段。因此还需要用户自行进行数据验证,以确保同步结果满足要求。

独立校验和内置校验区别

一致性校验分为独立校验和内置校验两种校验方式,用户可以根据实际诉求选择。
对比项
内置校验
独立校验
定义
校验服务内置于 DTS 任务中,需要在任务运行中时发起一致性校验,DTS 任务结束后,不支持发起校验。
校验服务独立于 DTS 任务外,选择源端和目标端相同的数据块进行对比。DTS 任务结束后,不支持发起校验。
对比范围
仅对比 DTS 任务勾选的同步对象,源库中未勾选的同步对象不在校验范围内。
仅对比由 DTS 写入到目标端的数据,用户自己在目标端写入的数据不在校验范围内。
可对比 DTS 任务中未勾选的其他同步对象。
可对比用户自行在目标端写入的数据。
校验过程中要求
源端可以有 DML 数据写入,不能有 DDL 数据写入,否则校验可能不准确。
建议在静态数据状态下发起校验,即源端和目标端都无数据写入,否则校验结果不准确。

校验内容

一致性校验支持全量校验和持续增量校验。
全量校验
针对目标端追平源端数据前的全部数据进行比较。
持续增量校验
针对持续增量校验任务发起后产生的增量数据进行比较。

适用场景

当前支持数据一致性校验的同步链路如下:
MySQL/MariaDB/Percona/TDSQL-C MySQL/TDSQL MySQL > MySQL
MySQL/MariaDB/Percona/TDSQL-C MySQL/TDSQL MySQL > MariaDB
MySQL/MariaDB/Percona/TDSQL-C MySQL > TDSQL-C MySQL
MySQL/MariaDB/Percona/TDSQL-C MySQL/TDSQL MySQL > TDSQL MySQL
MySQL/MariaDB/Percona/TDSQL-C MySQL/TDSQL MySQL > TDSQL TDStore

注意事项及约束

1. 数据一致性校验任务可能会增加源数据库实例的负载,因此请在业务低峰期进行操作。
2. 对比校验约束:
完整校验、抽样校验:对于无主键/无唯一键的表,行数小于5万行时支持校验,大于5万行的表会跳过校验。
行数校验:不要求有主键或者唯一键。
3. 当前校验任务对 DDL 操作不感知,如果在同步过程中,用户对源库做了 DDL 操作,会出现校验结果不一致,需要用户重新发起校验任务才能得到准确的对比结果。
4. 一致性校验任务中,DTS 单次查询源或者目标端数据的超时限制为10min,单次查询指每个分块校验会查询一次,行校验会查询一次等。如果单次查询时间超出10min(例如源端查询的表为大表时),则会导致校验任务失败。
5. 仅支持单向同步、双向同步的数据校验;不支持多到一、一到多、环形、星形同步等复杂拓扑结构的数据校验。
6. 同步任务配置中如果勾选了部分 DML、DDL,或者进行 Where 条件过滤,会造成源与目标库的数据不一致,一致性校验时不支持内置校验。
7. 同步任务进行如下配置,可能导致数据校验的结果不一致,请在创建校验任务时知晓。
数据初始化类型未勾选“全量数据初始化”,则可能存在源和目标的数据不一致,并最终导致数据校验的结果不一致。
主键冲突勾选了“冲突忽略”,勾选后发生冲突后可能会导致源和目标的数据不一致,并最终导致数据校验的结果不一致。
8. 在同步一致性校验功能发布之前(MySQL/MariaDB/TDSQL-C MySQL 为2023年1月12日,TDSQL MySQL 到 TDSQL MySQL 为2023年7月30日,MySQL/MariaDB/Percona 与 TDSQL MySQL 相互之间的链路为2023年10月20日)已经存在的存量任务,因 DTS 版本过低,暂不支持直接创建校验任务,需要 提交工单 升级版本后才能创建。
9. TDSQL MySQL 相关的链路进行数据一致性校验时,还需注意以下内容:
9.1 源端或者目标端为分布式 TDSQL MySQL 时,请在业务低峰进行数据一致性校验,否则可能会出现校验结果不一致。
9.2 不支持校验有虚拟列的表,如果遇到该类表,校验任务可能会报错。
10. 内置校验注意事项。
10.1 内置校验的范围,仅对比源数据库选择的库表对象、和同步到目标数据库的库表对象。如果用户在同步任务过程中向目标库进行数据写入,则这部分数据不包含在校验范围内,也不包括其他高级对象(如存储过程、函数)、视图等。如果同步任务配置中未选择“结构初始化”(表示不同步表结构),则进行一致性校验时也不校验表结构。
10.2 内置校验需要在同步任务运行中发起,如果在内置校验任务还未结束时,用户选择结束同步任务,则内置校验任务会失败。
10.3 因为内置校验需要在源数据库中创建新库 __tencentdb__,并在该库下写入 CheckSum 表,所以源数据库为只读时将会跳过一致性校验。
11. 独立校验约束限制。
如果在数据同步的任务中已经对表进行了列重命名、列过滤、表重命名操作,在后续创建独立校验时,存在如下交互限制。
11.1 同步链路中配置了列重命名和列过滤:在进行独立校验时,校验对象选择“全部对象”,进行过列重命名和列过滤的表可以校验。
11.2 同步链路中配置了列重命名和列过滤:在进行独立校验时,校验对象选择“自定义对象”,校验对象所选列必须为同步对象过滤后列的子集,否则进行过列重命名和列过滤的表将会被跳过校验。
11.3 同步链路中配置了表的重命名:在进行独立校验时,若校验对象选择“自定义对象”,选择校验对象时需要依次勾表对象,不能勾选整库,否则之前进行过重命名的表,会被跳过校验。

实现原理

内置校验

DTS 对 MySQL 系数据库的一致性校验是基于 row 模式(binlog_format = row),row 模式可以实现 master 和 slave 的正确复制,保障数据的安全性。
实现原理如下:

1. 在源库创建校验库__tencentdb__.Checksums,用于存储同步任务过程中的数据对比信息。
2. 选择待校验表的非空唯一键作为校验固定字段。
3. 计算源数据库的校验值 crc1 和行数 count1,并写入到源库的__tencentdb__.Checksums中。
crc 的计算方法类似于分块校验,根据校验固定字段,选取一个固定的范围(例如选取A表中,主键从1-1000的数据),将这些数据按行拼接起来计算出一个 crc,这样每个分块数据得到一个 crc,同时计算源库总的数据得到 crc1。
4. DTS 解析 binlog 中的 row 模式数据,还原出在源库写入校验值的 SQL,然后将这个 SQL 在目标库上重放。
目标库上使用与源库相同的变量计算校验值和行数,得到目标库的 crc2 和 count2。
5. 对比源和目标库的校验值和行数,显示对比结果。

独立校验

独立校验是一个不依赖于 DTS 数据迁移任务、可以独立运行的数据比对工具。它根据用户自定义的配置文件,通过同时并行查询源端和目标端的数据来进行数据比对。为了支持在异构数据库之间进行数据比对,会将不同数据库的数据按照统一的类型映射规则进行转换。同时,为了增加数据比对的并发度,并尽可能消除数据同步延时的影响,会将每个表进行切片处理,每个数据分片即为数据比对中最小的数据查询和处理单元。
实现原理如下:

1. 配置解析:主要包括识别本次数据比对任务涉及的数据库表、处理重命名规则、配置 Where 条件等。独立校验支持用户配置整实例、整库以及自定义库表等不同的对象来进行数据比对,支持用户设置表、列的白名单和黑名单,同时还支持对库、表、列名设置 rename 转换规则,支持在各表上设置 Where 过滤条件等。通过不同的配置,用户可以根据自身需求来选择适当的对象进行数据比对。
2. 表结构解析:主要包括列名及列类型解析、字符集及排序规则查询、主键和非空唯一键查询等步骤。对于无主键且无非空唯一键的表,行数小于等于 5w 行时,独立校验会通过对数据值进行 CRC 计算的方式来对比表数据的一致性,由于无法找到数据的唯一标识,这些表无法输出精确的不一致行数据,也无法输出订正 SQL;而对于行数大于 5w 行时,会跳过这些表的数据比对。列类型解析在异构场景下非常重要,我们会根据统一的类型映射规则,将不同数据源之间的数据转换成同样的内存数据类型,列类型解析是这个重要步骤的基础。
3. 数据切片:为了提高数据查询和数据比对的并行度,独立校验会对表数据进行切片处理,每个数据分片也是进行数据查询和数据比对的最小单元。
对于 MySQL 类型的数据库,独立校验采用了基于主键顺序分割的切片策略,这是因为 MySQL 以 B+ 树这种数据结构来组织其数据,基于主键的范围查询能使得效率更高,实现最小 I/O 消耗。独立校验使用的一种典型的数据切片算法是:基于表主键的最小值、最大值和主键顺序,遍历该表的所有主键值,每次以固定的 chunkSize 来查询切片的上下边界值(即主键值),并以此来确定一个数据切片的范围。独立校验还采用了多级并发策略来优化整个切片过程。首先,对于存在分片或者分区的数据表,其数据会基于分片和分区来拆分成多个数据段来增加切片并发度;其次,在一个数据段内部,也会采用双向逼近的策略,并发地从首尾两端进行数据切片。
4. 数据对比:主要包含数据查询、数据类型转换以及数据一致性对比。数据类型转换是这一阶段的关键步骤,由于异构数据库中存在着列类型的各种差异,因此我们在进行异构数据库的数据比对之前,会根据预先定义的类型映射规则,将不同数据库的列类型转换成标准的内存数据类型,同时这一过程还会处理异构数据库间的字符集编码差异、时间类型及范围差异、浮点数精度差异等,以确保这些数据比对的正确性。独立校验会基于主键或唯一键标识,对比每行数据是否一致。对于不一致的数据,会输出具体数据字段的数据差异以及查询SQL,以方便用户快速定位数据。同时,独立校验还会针对不一致数据生成订正 SQL,以便于用户能够修复数据。

创建数据一致性校验

自动触发

您可以在新建 DTS 同步任务时,开启数据一致性校验任务,当后续任务进行到同步增量步骤时自动触发一次一致性校验任务。
设置一致性校验页面,勾选开启数据一致性校验,配置参数后,单击下一步
说明:
其他同步操作请参见同步操作指导

配置项
参数
描述
校验选项
校验内容
全量校验:针对校验任务发起时源和目标库中的全部数据进行比较。
持续增量校验:针对持续增量校验任务发起后产生的增量数据进行比较。
校验基准
两端:使用源端和目标端的数据作为校验基准。
校验参数配置
线程数选择
设置范围为1~8,请根据实际情况选择,提高线程数可加快一致性校验速度,但也会增加源和目标库的负载。
复检次数
设置复检次数。
如果在第一次全量数据校验结果为不一致时,后台会对全量校验的不一致数据,发起校验。
复检时间间隔
设置复检时间间隔。
校验对象选项
校验对象
全部同步对象:校验范围为同步任务勾选的全部对象。
自定义选择:在勾选的同步对象中,选择进行校验的对象。

手动创建

1. 登录 DTS 控制台
2. 数据同步页面,选择需要校验的同步任务,在操作列选择更多 > 创建数据一致性校验
说明:
一致性校验需要在“目标与源库数据差距”小于100MB时,才可以创建。如果界面按钮呈灰色,则同步任务状态不满足条件,如任务配置中勾选了部分 DML 或 DDL、设置了 Where 条件过滤、任务失败、源和目标的数据差距大于100MB、同步拓扑结构为复杂拓扑等。

3. 数据一致性校验页面,单击创建数据一致性校验

说明:
如果已存在一致性校验任务,可以单击操作列的创建类似任务,并支持配置相关参数。

4. 在弹出的对话框中,配置数据一致性校验参数后,单击创建并启动一致性校验

参数
说明
任务名称
创建一致性校验任务的名称。
校验方式
独立校验:校验服务独立于 DTS 任务外,选择源端和目标端相同的数据块进行对比。DTS 任务停止运行后,不支持发起校验。
内置校验:校验服务内置于 DTS 任务中,需要在任务运行中时发起一致性校验,DTS 任务停止运行后,不支持发起校验。
校验内容
全量校验:针对校验任务发起时源和目标库中的全部数据进行比较。
持续增量校验:针对持续增量校验任务发起后产生的增量数据进行比较。
校验基准
两端:使用源端和目标端的数据作为校验基准。
校验类型
完整校验:对所选校验对象的完整数据进行校验。
抽样校验:对所选校验对象抽选一定的比例进行校验。
行数校验:对所选校验对象,仅对比数据行数。
抽样比例
配置抽样比例,抽样比例支持10%,20%,30%……90%。
说明:
校验类型抽样校验时,才需配置该参数。
校验对象
全部同步对象:校验范围为同步任务勾选的全部对象。
自定义选择:在勾选的同步对象中,选择进行校验的对象。
线程数选择
设置范围为1~8,请根据实际情况选择,提高线程数可加快一致性校验速度,但也会增加源和目标库的负载。
复检次数
设置复检次数。
如果在第一次全量数据校验结果为不一致时,后台会对全量校验的不一致数据,发起校验。
复检时间间隔
设置复检时间间隔。

查看数据一致性校验结果

1. 数据同步页面,选择需要查看的同步任务,在操作列选择更多 > 创建数据一致性校验
2. 在操作列单击查看,即可查看校验结果。

3. 查看校验结果。
全量校验:查看预估表总数已检测表数量不一致表数量已跳过表数、源库行数、目标库行数
预估表总数:预计校验的表总数的估算值,与最终实际校验表总数会有少许差异,因为准确提供预计校验表总数会影响整体校验性能。
未检查表原因:无主键或者非空唯一键、空表、不支持的引擎类型、表不存在。

持续增量校验:查看已校验记录数不一致记录数不一致表数量

4. 查看不一致详情。
全量校验
内置校验场景,针对不一致性的结果,需要用户手动对比源数据库和目标数据库的对应内容。

请按照界面提示的数据库数据表索引名称索引上边界索引下边界这些参数定位到具体位置进行对比。
参考操作如下:
1. 登录源数据库,查询提示的索引范围。
select * from table_name where col_index >=1 and col_index <=5;
2. 登录目标数据库,查询提示的索引范围。
3. 对比目标和源的数据差距。
独立校验场景
4.1.1.1 已检测区域单击对应表后的查看,可查看不一致的数据详情。

4.1.1.2 在弹出的对话框中查看不一致详情。

4.1.1.3 在操作列单击订正语句

查看订正语句。

4.1.1.4 在对话框右侧单击

,下载不一致详情。

可下载不一致信息及订正语句或仅下载订正语句。

持续增量校验
4.1.2 已检测区域单击对应表后的查看,可查看不一致的数据详情。

4.1.2.1 在弹出的对话框中查看不一致详情。

4.1.2.2 在操作列单击订正语句。

查看订正语句。

4.1.2.3 在对话框右侧单击

,下载不一致详情。

4.1.2.4 在弹出的对话框中,下载不一致信息,单击下载

4.1.3 已检测区域单击对应表后的复检,可针对不一致数据,再次发起一致性校验。

在弹出的对话框中,单击确认

5. 下载对比结果详情。
5.1 校验进展页面,选择全量校验持续增量校验,单击右侧

,下载对比结果详情。

5.2 在弹出的对话框中,单击下载