创建数据一致性校验(MySQL 系)

最近更新时间:2026-01-27 16:49:27

我的收藏

操作场景

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

独立校验和内置校验区别

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

使用场景

当前支持数据一致性校验的链路如下:
MySQL/MariaDB/Percona/TDSQL MySQL/TDSQL-C MySQL > MySQL
MySQL/MariaDB/Percona/TDSQL MySQL/TDSQL-C MySQL > MariaDB
MySQL/MariaDB/Percona/TDSQL-C MySQL > TDSQL-C MySQL
MySQL/MariaDB/Percona/TDSQL MySQL/TDSQL-C MySQL > TDSQL MySQL
TDSQL MySQL > TDSQL Boundless(仅独立校验支持)

注意事项及约束

1. 数据一致性校验任务可能会增加源数据库实例的负载,因此请在业务低峰期进行操作。
2. 对比校验约束:
完整校验、抽样校验:对于无主键/无唯一键的表,行数小于5万行时支持校验,大于5万行的表会跳过校验。
行数校验:不要求有主键或者唯一键。
3. 当前校验任务对 DDL 操作不感知,如果在迁移过程中,用户对源库做了 DDL 操作,会出现校验结果不一致,需要用户重新发起校验任务才能得到准确的对比结果。
4. 一致性校验任务中,DTS 单次查询源或者目标端数据的超时限制为10min,单次查询指每个分块校验会查询一次,行校验会查询一次等。如果单次查询时间超出10min(例如源端查询的表为大表时),则会导致校验任务失败。
5. 内置校验注意事项。
5.1 内置校验的范围,仅对比源数据库选择的库表对象和迁移到目标数据库的库表对象。如果用户在迁移任务过程中向目标库进行数据写入,则这部分数据不包含在校验范围内,也不包括其他高级对象(如存储过程、函数)、视图、账号等。
5.2 如果在数据一致性校验任务还未结束时,用户选择完成或者终止 DTS 任务,则数据一致性校验任务会失败。
5.3 因为一致性校验需要在源数据库中创建新库 __tencentdb__,并在该库下写入 Checksum 表,所以源数据库为只读时将会跳过一致性校验。
6. 独立校验约束限制。
同步链路中配置了表的重命名:在进行独立校验时,若校验对象选择“自定义对象”,选择校验对象时需要依次勾选表对象,不能勾选整库,否则之前进行过重命名的表,会被跳过校验。

实现原理

内置校验

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,请根据实际情况选择,提高线程数可加快一致性校验速度,但也会增加源和目标库的负载。
复检次数
设置复检次数。
如果在第一次全量数据校验结果为不一致时,后台会对全量校验的不一致数据,发起校验。
复检时间间隔
设置复检时间间隔。
校验对象选项
配置项
说明
校验对象
全部迁移对象:校验范围为迁移任务勾选的全部对象。
自定义选择:在勾选的迁移对象中,选择进行校验的对象。

手动创建

您可以针对存量 DTS 迁移任务,创建数据一致性校验任务。
1. 登录 DTS 控制台
2. 数据迁移页面,选择需要校验的迁移任务,在操作列选择更多 > 创建数据一致性校验
说明:
数据一致性校验需要在迁移任务步骤进行到同步增量时,才可以创建。如果界面按钮呈灰色,则 DTS 任务状态不满足条件,如任务未进行到同步增量步骤、任务失败、任务终止。

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 在弹出的对话框中,单击下载