阿里云DTS踩坑经验分享系列|数据不一致修复大法

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: 阿里云数据传输服务DTS在帮助用户迁移数据、同步数据时,在某些复杂场景下会出现源库与目标库数据不一致的问题,造成数据错误,给用户带来困扰。由于数据不一致的问题很难完全避免,为了及时修复不一致的数据,DTS产品推出数据订正功能,保障用户在同步\迁移数据时的数据一致性。本文介绍了产生数据不一致的一些典型场景,并重点阐述了如何使用DTS数据订正功能来修复不一致的数据。

阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。

点击立即体验MySQL->ClickHouse同步链路


1、导读

阿里云数据传输服务DTS在帮助用户迁移数据、同步数据时,在某些复杂场景下会出现源库与目标库数据不一致的问题,造成数据错误,给用户带来困扰。由于数据不一致的问题很难完全避免,为了及时修复不一致的数据,DTS产品推出数据订正功能,保障用户在同步\迁移数据时的数据一致性。本文介绍了产生数据不一致的一些典型场景,并重点阐述了如何使用DTS数据订正功能来修复不一致的数据。

2、DTS数据不一致场景

在同步\迁移数据过程中产生数据不一致场景的原因很复杂,我们可以通过下面的三个典型例子来看下为什么会出现数据不一致的情况。

2.1 字段类型不一致

例如用户在源库中有表A,表结构定义如下,其中 id 为自增主键,user_id 表示用户id,words表示用户的评论

CREATE TABLE `Example`.`A` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` int DEFAULT NULL COMMENt 'user_id', 
  `words` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'words',
  Primary Key (`id`)
) ENGINE=InnoDB

在目标库中,用户已经创建了一张需要同步的表A,表结构定义如下

CREATE TABLE `Example`.`A` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` int DEFAULT NULL COMMENt 'user_id',
  `words` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'words',
  Primary Key (`id`)
) ENGINE=InnoDB

如果此时在源端插入一条数据,id = 1, user_id = 123456, words = 'Welcome to use data transmission service!' 如下所示:

INSERT INTO `Example`.`A` (`id`, `user_id`, `words`) VALUES (1, 123456, 'Welcome to use data transmission service!')

在源端这条数据能够被正确地写入,但是在目标端,由于detail字段的类型设置为varchar(20),写入时会产生截断,最终在目标端写入的数据就会变成:

id = 1, user_id = 123456, words = 'Welcome to use data '

显然,此种情况下目标端的words字段与源端的words字段不一致了。

2.2 业务双写场景

再比如,(接着上面的例子)假设用户在使用DTS进行数据同步的过程中,由于某些原因将部分业务流量切换到了目标端,导致目标端删除了 user_id = 123456 的数据,如下所示:

DELETE FROM `Example`.`A` WHERE `user_id` = 123456

此时目标端的该记录显然会被删除,但由于这是一条单向同步链路两端业务双写导致源端 user_id = 123456 的记录依然存在,因此产生了数据不一致的情况。

2.3 用户侧非标准操作

DTS无法限制用户的行为,这在一些场景中也会造成数据不一致。例如,DTS支持从自建MySQL数据库同步到RDS MySQL数据库,并支持RENAME TABLE的操作。但如果用户配置任务时选择了仅同步表A,却在同步过程中执行了以下语句:

RENAME TABLE A TO B

此时数据库中实际存在的表为表B,但用户的同步任务配置的却是表A,那么在RENAME TABLE后所有对表B进行的数据变更都不会同步到目标端,造成了数据不一致。(正确操作是配置库级别同步~)

其实对于类似有风险的行为,DTS会在文档中进行说明,用户在配置任务前需要确认这些风险点。详细内容请参考:配置数据同步任务

2.4 小结

实际生产中,产生数据不一致的场景还有很多,尤其是在源端和目标端数据库异构的情况下,DTS研发同学难以在文档中列举出所有可能导致数据不一致的场景,只能在日常运维中 case by case 地分析定位原因。为了及时修复不一致数据,DTS推出了数据订正功能,最大限度确保数据最终一致性。

3、DTS数据订正功能原理

DTS数据订正功能采用校验+订正的模式,即:先校验出不一致的数据,然后将这些不一致的数据进行订正。具体流程如下图所示:

image.png

需要指出的是,由于数据订正过程中迁移/同步任务可能还在继续,这有可能导致订正结束之后仍然存在数据不一致,因此在订正的最后会复检订正的数据是否已经完全一致了,DTS也会根据复检的结果来判断是否需要二次订正,直至订正结果显示所有订正的数据在源端和目的端均已保持一致。

此外,由于数据订正是一个高危的操作,为了保证出现问题时的数据可恢复性,DTS会保存所有执行的Insert/Delete/Update等数据操作用于回滚数据。

4、如何使用数据订正功能

4.1 检查数据一致性

检查数据是否一致通常有两种方式:

用户自行检查:通过业务逻辑来判断数据同步是否成功,或者随机地抽取一些数据进行检查。

DTS数据校验:目前DTS的数据校验包括全量校验和增量校验,能精准判断出在数据迁移/同步过程中是否出现了数据不一致,并且能够提供不一致数据的具体内容。

如果用户发现了数据不一致,需要联系DTS的运维同学,排查出数据不一致的原因并进行数据订正。由于数据订正功能属于高危操作,会对用户数据直接进行修改,因此该功能并不直接开放给用户,而是在用户授权的情况下,由研发同学结合实际情况,在后台使用数据订正功能来帮助用户订正数据。

4.2 确认数据订正条件

找到DTS同学之后,DTS同学会及时帮助用户分析数据不一致的原因,并在需要的情况下帮用户订正数据。在数据订正之前需要说明的是,数据订正是有风险的,为了避免造成用户损失,DTS通常会根据过往经验总结一些数据订正条件让用户确认(以下仅为举例说明,以DTS实际提出的订正条件为准)

image.png

如果不满足上述订正前置条件,为了避免出现数据订正失败且无法回滚的情况,DTS不会帮助用户进行数据订正。

在满足上述条件之后,用户还需要向DTS同学口头授权同意订正,这样一来DTS同学才可以进行数据订正操作。

4.3 验证订正结果

订正的过程完全由DTS负责,因此用户在发出订正需求之后就不需要进行其它操作了。但在数据订正之后,DTS通常建议用户自己再进行一次全量校验以检查数据是否一致,避免后续产生纠纷。

如果用户对订正的数据有疑问,DTS也可以提供进行数据订正的全部SQL语句。

5、总结

阿里云DTS提供了完整的数据校验+数据订正能力,确保用户在进行数据迁移/同步过程中出现数据不一致时,能够快速发现问题并解决问题,最大限度确保数据最终一致性。

6、快来关注

  1. 数据传输服务(Data Transmission Service,简称DTS)支持关系型数据库、NoSQL、大数据(OLAP)等数据源,集数据迁移、订阅、实时同步、校验功能于一体,能够解决公共云、混合云场景下,远距离、秒级异步数据传输难题。其底层基础设施采用阿里双11异地多活架构,为数千下游应用提供实时数据流,已在线上稳定运行7年之久,是一款沉淀了丰富实践经验的可靠产品。点击了解更多DTS相关信息

  1. 欢迎加入钉群讨论交流:

相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
3月前
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
219 2
|
4月前
|
NoSQL MongoDB 数据库
DTS 的惊天挑战:迁移海量 MongoDB 数据时,捍卫数据准确完整的生死之战!
【8月更文挑战第7天】在数字化时代,大数据量的MongoDB迁移至关重要。DTS(数据传输服务)通过全面的数据评估、可靠的传输机制(如事务保证一致性)、异常处理(如回滚或重试),以及迁移后的数据校验来确保数据准确无损。DTS还处理数据转换与映射,即使面对不同数据库结构也能保持数据完整性,为企业提供可靠的数据迁移解决方案。
66 2
|
6月前
|
SQL 分布式计算 DataWorks
MaxCompute产品使用问题之dts是否支持传输数据到mc主键表2.0
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5月前
|
SQL 负载均衡 安全
阿里云DTS踩坑经验分享系列|全量迁移加速方法指南
阿里云数据传输服务DTS是一个便捷、高效的数据迁移和数据同步服务。一般而言,一个完整的DTS数据迁移任务主要包括预检查、结构迁移,全量迁移,增量迁移等阶段,其中全量迁移会将源数据库的存量数据全部迁移到目标数据库。面对各种各样的用户场景, 本文将重点介绍如何使用阿里云DTS实现全量数据迁移加速,以缩短迁移时间,确保数据迁移的效率和稳定性。
550 0
|
6月前
|
存储 数据采集 NoSQL
DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
【6月更文挑战第4天】DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
146 1
|
6月前
|
NoSQL 关系型数据库 MongoDB
DTS支持哪些非关系型数据库的数据交互?
【6月更文挑战第4天】DTS支持哪些非关系型数据库的数据交互?
69 1
|
7月前
|
关系型数据库 MySQL 数据挖掘
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
DTS 作为阿里云核心的数据交互引擎,以其高效的实时数据流处理能力和广泛的数据源兼容性,为用户构建了一个安全可靠、可扩展、高可用的数据架构桥梁。阿里云数据库 SelectDB 通过与 DTS 联合,为用户提供了简单、实时、极速且低成本的事务数据分析方案。用户可以通过 DTS 数据传输服务,一键将自建 MySQL / RDS MySQL / PolarDB for MySQL 数据库,迁移或同步至阿里云数据库 SelectDB 的实例中,帮助企业在短时间内完成数据迁移或同步,并即时获得深度洞察。
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
|
7月前
|
SQL 分布式计算 监控
在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
【2月更文挑战第32天】在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
70 6
|
7月前
DTS数据传输延迟可能有多种原因
【1月更文挑战第16天】【1月更文挑战第79篇】DTS数据传输延迟可能有多种原因
291 2
|
存储 Java 数据库连接
云数据仓库ADB不管是jdbc写入或者dts同步,均会存在丢数据的情况?
云数据仓库ADB不知道是不是磁盘出问题了不管是jdbc写入或者dts同步,均会存在丢数据的情况?
87 2