操作场景
数据一致性校验,即 DTS 对数据迁移的源库和目标库的表数据进行对比,并给出对比结果和不一致详情,辅助用户在割切前快速验证同步结果。数据一致性校验任务是独立进行的,不会影响源数据库的正常业务,也不会影响 DTS 的任务。
说明
一致性校验仅作为辅助的数据验证手段。在正式割接前,请用户自行进行演练操作以确保结果满足割接要求。
使用场景
当前支持数据一致性校验的链路如下:
MySQL/MariaDB/Percona/TDSQL MySQL > MySQL
MySQL/MariaDB/Percona/TDSQL MySQL > MariaDB
MySQL/MariaDB/Percona > TDSQL-C MySQL
MySQL/MariaDB/Percona/TDSQL MySQL > TDSQL MySQL
MySQL/MariaDB/Percona/TDSQL TDStore > TDSQL TDStore
注意事项
数据一致性校验的范围,仅对比源数据库选择的库表对象和迁移到目标数据库的库表对象,如果用户在迁移过程中向目标库进行数据写入,则这部分数据不包含在校验范围内,也不包括其他高级对象(如存储过程、事件等)、账号等。
数据一致性校验任务可能会增加源数据库实例的负载,因此请在业务低峰期进行操作。
数据一致性校验的任务可以多次创建并执行,但同一时刻只能有一个校验任务处于“运行中”,即上一个校验任务结束或者终止后,下一个校验任务才能启动。
需要校验的表必须具有主键或唯一键,否则 DTS 将跳过,不进行校验。
如果在数据一致性校验任务还未结束时,用户选择完成或者终止 DTS 任务,则数据一致性校验任务会失败。
因为一致性校验需要在源数据库中创建新库
__tencentdb__
,并在该库下写入 CheckSum 表,所以源数据库为只读时将会跳过一致性校验。约束限制
当前校验任务对 DDL 操作不感知,如果在迁移过程中,用户对源库做了 DDL 操作,会出现校验结果不一致,需要用户重新发起校验任务才能得到准确的对比结果。
一致性校验任务中,DTS 单次查询源或者目标端数据的超时限制为10min,单次查询指每个分块校验会查询一次,行校验会查询一次等。如果单次查询时间超出10min(例如源端查询的表为大表时),则会导致校验任务失败。
实现原理
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. 对比源和目标库的校验值和行数,显示对比结果。
创建数据一致性校验任务
自动触发
自动触发的一致性校验,不能设置校验的详细参数,默认校验对象为“全部迁移对象”,对比类型为“完整对比”,线程数默认采用“1”。


手动创建
1. 登录 DTS 控制台。
2. 在数据迁移页面,选择需要校验的迁移任务,在操作列单击创建数据一致性校验。


3. 单击创建数据一致性校验。
说明
数据一致性校验需要在迁移任务步骤进行到同步增量时,才可以创建。如果界面按钮呈灰色,则 DTS 任务状态不满足条件,如任务未进行到同步增量步骤、任务失败、任务终止。


4. 在弹出的对话框中,单击确定。


5. 配置数据一致性校验参数后,单击创建并启动一致性校验。


参数 | 说明 |
校验对象 | 全部迁移对象:校验范围为迁移任务勾选的全部对象。 自定义选择:在勾选的迁移对象中,选择进行校验的对象。 |
对比类型 | 完整对比:对所选检验对象的完整数据进行校验。 抽样对比:对所选检验对象抽选一定的比例进行校验,抽样比例支持10%,20%,30%……90%。 行数对比:对所选校验对象,仅对比数据行数。选择行数对比时,不要求表对象有主键,无主键表也可以进行校验。 |
线程数选择 | 设置范围为1~8,请根据实际情况选择,提高线程数可加快一致性校验速度,但也会增加源和目标库的负载。 |
查看数据一致性校验结果
1. 在迁移任务首页,最后一次校验结果列,可查看校验结果,一致或者不一致,单击查看更多进入校验详情页。


2. 单击查看,即可查看校验结果。


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


校验不一致的结果示例:


针对不一致性的结果,需要用户手动对比源数据库和目标数据库的对应内容。请按照界面提示的数据库、数据表、索引名称、索引上边界、索引下边界这些参数定位到具体位置进行对比。
参考操作如下:
1. 登录源数据库,查询提示的索引范围。select * from table_name where col_index >=1 and <=5;2. 登录目标数据库,查询提示的索引范围。3. 对比目标和源的数据差距。