阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。
作者:宇缤
一、导读
大数据时代背景下,高效的数据流转与实时分析能力对于企业的竞争力至关重要。阿里云数据传输服务DTS与SelectDB联合,为用户提供了简单、实时、极速且低成本的事务数据分析方案。用户可以通过 DTS 数据传输服务,一键将自建 MySQL/PostgreSQL、RDS MySQL/PostgreSQL、PolarDB for MySQL/PostgreSQL 数据库,迁移或同步至阿里云数据库 SelectDB 的实例中,帮助企业在短时间内完成数据迁移或同步,并即时获得深度洞察。
二、DTS SelectDB链路能力介绍
1.链路能力界限
DTS支持从MySQL/PostgreSQL 迁移或同步 结构/全量/增量数据到阿里云SelectDB,当您使用DTS传输数据时,需要了解DTS支持的能力、功能限制和接入DTS的准备工作,以便您平稳地完成数据迁移或同步。
限制项 |
说明 |
支持的版本 |
|
支持的架构 |
|
支持的数据 |
|
特别注意事项
- 待同步或迁移的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
- 在库表结构同步和全量同步阶段,请勿执行库或表结构变更的DDL操作,否则会导致数据同步任务失败。
- 由于SelectDB实例仅支持以字母开头的库名和表名,如果待同步的库名或表名不是以字母开头,则需要使用映射功能进行修改。
- 待同步对象(库、表、列)的名称不能包含中文,若有,则需要使用映射功能进行修改(例如将其修改为英文),否则可能会导致任务失败。
- 在数据同步过程中,请勿在SelectDB数据库中增加BE(Backend)节点,否则会导致任务失败,可重启DTS任务尝试进行恢复。
2.库表结构迁移
DTS支持MySQL/PostgreSQL到SelectDB的库表结构迁移。当DTS任务中勾选了库表结构迁移时,会在任务配置过程中增加“配置库表字段”页面。在该页面上可以对SelectDB中表的Key列、分桶列(Distributed by...)、表引擎进行设置。
当待迁移的表需具备主键或唯一约束时,DTS库表结构迁移模块默认在SelectDB创建Unique表,且Key列和分桶列默认选用源端的主键列/唯一键列。
当待迁移的表需不具备主键且不具备唯一约束时,DTS库表结构迁移模块默认在SelectDB创建Duplicate表,且需要在“配置库表字段”页面手动配置Key列和分桶列。且库表结构迁移模块会在已有列的基础上增加_is_deleted、_version、_record_id三个标识列用于判断数据的存在性、源端生成时间和写入目标端的顺序,下表为3个标识的具体说明:
名称 |
数据类型 |
默认值 |
说明 |
_is_deleted |
int |
0 |
数据是否被删除:
|
_version |
bigint |
0 |
数据生成的版本:
|
_record_id |
bigint |
0 |
数据写入的标识:
|
3.数据迁移
3.1 迁移/同步数据到SelectDB的Unique表
全量迁移阶段,DTS从源端切片拉取数据,通过StreamLoad方式写入SelectDB,支持断点续传和数据过滤,支持切片级别的并发读取和写入,提供高性能的数据迁移能力。
增量迁移阶段,基于Unique表的数据合并能力以及StreamLoad的删除标记列能力,实现大规模增量数据的攒批StreamLoad写入,并且采用写时合并策略(merge on write),降低对业务读取的扰动。
3.2 迁移/同步数据到SelectDB的Duplicate表
DTS全量和增量迁移均采用StreamLoad方式写入,并且增量阶段对于insert/update/delete均采用追加写的形式进行同步,实现对于源端数据变更历程的完整记录。
为判断数据的存在性、源端生成时间和写入目标端的顺序,需使用DTS库表结构迁移或保证Duplicate表中具有以上_is_deleted、_version、_record_id三个标识列,并在业务上依据标识列对数据进行筛选。
三、常见问题解答
1.Char/Varchar类型数据超长无法写入
MySQL和PostgreSQL中VARCHAR(n)中n代表是字符长度,而在SelectDB中是字节长,由于SelectDB采用utf8mb4编码,所以建议将SelectDB中列的长度设置为VARCHAR(4*n),从而避免数据超长导致无法写入。
2.String类型数据超长无法写入
SelectDB中String类型数据默认允许占用空间为1048576字节(1MB),当源端对应列数据长度超过该限制时,会导致数据写入报错。可通过修改SelectDB集群中BE节点的配置项string_type_length_soft_limit_bytes来调整String支持的空间大小,最大支持2147483643字节(2GB)。
3.DateTime类型数据写入时报错:不允许将null值写入not null列
首先需要确认源端数据中是否存在null值。若源端对应列具有not null的约束,则通常是源端数据格式非法或不在SelectDB允许的范围内(例如:0000-00-00之类的zerodate)。这类数据在写入SelectDB时,引擎会自动转为null值,若SelectDB中该列具有not null的约束则会导致DTS任务异常。
针对该类问题,可修改源端非法值后重新进行数据同步,或去掉SelectDB中的not null约束来恢复DTS任务。
4.DTS同步过程中SelectDB集群新增BE节点导致同步异常
DTS任务启动时会获取并缓存SelectDB集群中BE节点的地址信息,以保证通过StreamLoad写入数据时能够通过重定向连接到指定的节点。DTS暂时无法主动感知任务运行中SelectDB集群内新增的BE节点,因此当SelectDB集群的BE节点数量发生变更时,可能会导致DTS同步出现异常,需要手动重启DTS任务来恢复任务。
四、快来关注
- 数据传输服务(Data Transmission Service,简称DTS)支持关系型数据库、NoSQL、大数据(OLAP)等数据源,集数据迁移、订阅、实时同步、校验功能于一体,能够解决公共云、混合云场景下,远距离、秒级异步数据传输难题。其底层基础设施采用阿里双11异地多活架构,为数千下游应用提供实时数据流,已在线上稳定运行7年之久,是一款沉淀了丰富实践经验的可靠产品。点击了解更多DTS相关信息
- 欢迎加入钉群讨论交流: