操作场景
数据一致性校验,即 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 Boundless
注意事项及约束
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 在已检测区域单击对应表后的查看,可查看不一致的数据详情。

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

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

查看订正语句。

4.1.4 在对话框右侧单击
,下载不一致详情。


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

5. 下载对比结果详情。
5.1 在校验进展页面,单击右侧
,下载对比结果详情。


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