本文为您介绍不同类型数据库作为目标库时的限制,以帮助您提前了解相关注意事项及DTS功能的限制,从而有效减少实例异常的发生。
通用限制
所有类型的数据库在作为目标库时,均存在以下限制条件:
请确保标库处于正常运行的状态。
请确保目标库有足够的空间存储数据。
请确保DTS服务的IP地址段能够被自动或手动添加至目标库的安全设置中,以允许DTS服务器的访问。更多信息,请参见添加DTS服务器的IP地址段。
数据库类型限制
不同类型的数据库作为目标库时,存在不同的限制条件,具体详情如下所示。
以下注意事项为数据同步和迁移实例的目标库限制。数据校验实例的限制,请参见配置数据校验中的注意事项。
MySQL系列数据库
MySQL
若您将列名仅大小写不同的字段写入到目标MySQL数据库的同一个表中,可能会因为MySQL数据库列名大小写不敏感,导致同步结果不符合预期。
在数据同步完成后,建议使用
ANALYZE TABLE <表名>
命令以确认数据均已写入目标表。例如,在MySQL触发HA切换机制后,可能会导致数据只写到了内存,从而造成数据丢失。若待同步或迁移的数据中包含需要四字节存储的内容(例如生僻字、表情等信息),则目标端接收数据的数据库和表必须使用utf8mb4字符集。
说明若您使用DTS同步或迁移库表结构,则需将目标库中实例级别的参数
character_set_server
设置为utf8mb4。若目标库的DDL写入失败,DTS任务会继续运行,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志。
若RDS MySQL实例已开通全密态(EncDB)功能,则不支持全量任务。
当目标库为RDS MySQL时,如果待同步或迁移的数据库名称不符合RDS MySQL的定义规范,您需要在配置DTS实例前在RDS MySQL中创建数据库。相关操作,请参见管理数据库。
若目标库为8.0.23及以后版本的MySQL数据库,且接收数据的列中包含不可见的隐藏列,则可能会因为无法找到写入数据的目标列,导致DTS实例运行失败或数据丢失。
说明您可以使用
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET VISIBLE;
命令,将该隐藏列设置为可见。更多信息,请参见Invisible Columns。无主键的表会自动生成不可见的隐藏主键,您也需要将该隐藏主键设置为可见。更多信息,请参见Generated Invisible Primary Keys。
PolarDB for MySQL
若您将列名仅大小写不同的字段写入到目标MySQL数据库的同一个表中,可能会因为MySQL数据库列名大小写不敏感,导致同步结果不符合预期。
在数据同步完成后,建议使用
ANALYZE TABLE <表名>
命令以确认数据均已写入目标表。例如,在MySQL触发HA切换机制后,可能会导致数据只写到了内存,从而造成数据丢失。若待同步或迁移的数据中包含需要四字节存储的内容(例如生僻字、表情等信息),则目标端接收数据的数据库和表必须使用utf8mb4字符集。
说明若您使用DTS同步或迁移库表结构,则需将目标库中实例级别的参数
character_set_server
设置为utf8mb4。若目标库的DDL写入失败,DTS任务会继续运行,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志。
MariaDB
若您将列名仅大小写不同的字段写入到目标MySQL数据库的同一个表中,可能会因为MySQL数据库列名大小写不敏感,导致同步结果不符合预期。
在数据同步完成后,建议使用
ANALYZE TABLE <表名>
命令以确认数据均已写入目标表。例如,在MySQL触发HA切换机制后,可能会导致数据只写到了内存,从而造成数据丢失。若目标库的DDL写入失败,DTS任务会继续运行,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志。
若目标库接收数据的列中包含不可见的隐藏列,则可能会因为无法找到写入数据的目标列,导致DTS实例运行失败或数据丢失。
PostgreSQL系列数据库
PostgreSQL
需提前创建用于接收数据的数据库。
PolarDB for PostgreSQL
需提前创建用于接收数据的数据库。
由于目标PolarDB PostgreSQL版集群不支持写入字符串的终止符('\0'),若待同步或迁移的数据中包含该终止符,DTS不会将该终止符写入到目标库,从而会导致数据不一致。
PolarDB(兼容Oracle)
需提前创建用于接收数据的数据库。
由于目标PolarDB PostgreSQL版(兼容Oracle)集群不支持写入字符串的终止符('\0'),若待同步或迁移的数据中包含该终止符,DTS不会将该终止符写入到目标库,从而会导致数据不一致。
由于目标PolarDB PostgreSQL版(兼容Oracle)集群会生成类似
pg_oid_1498503_index
的唯一索引,来对应源自建Oracle的ROWID,所以INDEX会比源自建Oracle多。源自建Oracle的CHECK约束迁移到目标PolarDB PostgreSQL版(兼容Oracle)集群后,会转换成NOT NULL约束。
NoSQL系列
Tair/Redis
若目标端为自建Redis,且在同步期间该自建Redis的连接地址发生变化,则需要重新配置任务。
目标端不支持2.8版本的云数据库Tair(兼容Redis)实例。
在DTS实例运行过程中出现包括但不限于以下情况,可能会使全量数据重新同步或迁移至目标端,从而导致数据不一致。
目标端Redis发生连接闪断,导致断点续传失败。
目标端Redis发生主备切换或故障切换。
目标端Redis的连接地址发生变化。
修改DTS实例的同步对象。
部署在ECS实例的Redis集群,除了控制台选择的ECS实例,其他ECS实例均需要手动添加DTS服务的IP地址段。
若目标端为已开启TLS(Transport Layer Security)加密功能的云数据库Tair(兼容Redis)实例,则必须以SSL安全连接的方式接入到DTS(不支持TLSv1.3)。当前暂不支持已开启SSL的云数据库Tair(兼容Redis)实例,以云实例的方式接入DTS。
若目标端的架构类型为集群版且某一个分片达到了内存上限,或目标端的存储空间不足时,DTS任务会因内存溢出(Out of Memory)而失败。
若目标端内存不足,触发数据逐出时,由于云数据库 Tair(兼容 Redis)的默认数据逐出策略(maxmemory-policy)为volatile-lru,会导致目标端与源端数据不一致的情况,但不会影响任务的正常运行。
为避免该情况发生,建议将目标端的数据逐出策略设置为noeviction,当目标端内存不足时,数据会写入失败,同时任务也会失败,但目标端不会因为数据逐出而丢失数据。
说明关于数据逐出策略详情,请参见Redis数据逐出策略介绍。
若目标端已开启透明数据加密TDE功能,则暂不支持通过DTS同步或迁移数据。
Redis社区版不支持双向同步。
MongoDB
副本集架构的MongoDB实例为目标时,需填写主节点连接地址或高可用连接地址。
若目标集合存在唯一索引或目标集合的
capped
属性为true
时,则在增量迁移阶段该集合不支持并发回放(只支持单线程写入),从而可能会导致任务延迟增高。由于DTS写入数据的逻辑为并发写入,所以会导致目标端占用的存储空间比源端大5%~10%。
请确保目标端MongoDB没有与源端相同的主键(默认为_id),否则会导致数据丢失。若目标端有与源端相同的主键,请在不影响业务的前提条件下清空目标端的相关数据(删掉目标端中与源端相同_id的文档)。
目标端MongoDB的count数量需要使用
db.$table_name.aggregate([{ $count:"myCount"}])
语法查询。数据库账号的权限要求:需要目标端dbAdminAnyDatabase权限、目标库的readWrite权限、local库的read权限。
Lindorm
不支持库表结构任务,需要提前在目标库中库表(参考源库的结构、源库与目标库的映射关系),否则可能会导致实例运行失败、数据不一致或数据丢失
不支持同步或迁移无主键表。
不支持仅同步或迁移主键字段,待同步或迁移的数据中必须包含一个非主键的字段。
当前仅支持将数据写入到Lindorm实例的宽表引擎中。
OLAP系列
AnalyticDB MySQL 3.0
若DTS实例运行时目标AnalyticDB MySQL版 3.0集群处于备份状态,将会导致DTS实例运行失败。
由于AnalyticDB MySQL版 3.0集群本身存在使用限制,当该集群中的节点磁盘空间使用量超过80%时,会导致DTS实例产生延迟。因此,请提前根据待迁移的对象评估所需的存储空间,以确保目标集群具备充足的存储空间。
开启多表归并的DTS实例,不支持在源库执行临时表模式的Online DDL(包括DMS Online DDL、Gh-ost和Pt-osc)。若源库有相关操作,则可能导致目标库数据丢失或DTS实例运行失败。
AnalyticDB PostgreSQL
目标表暂不支持AO表。
需提前创建用于接收数据的数据库。
ClickHouse
Elasticsearch
不支持开发测试型规格的Elasticsearch实例。
不支持同步或迁移DDL,如果源库中待同步或迁移的表需要执行增加列的操作,您只需先在Elasticsearch实例中修改对应表的mapping,然后在源库中执行相应的DDL操作,最后暂停并启动DTS同步实例。
若同步至Elasticsearch实例的数据包含空字符,则会转换成LONG类型的数据写入Elasticsearch实例,从而导致任务失败。
若同步或迁移至Elasticsearch实例的数据包含位置信息,且经纬度反向存储,将数据写入Elasticsearch实例时会报错。
SelectDB
在DTS实例运行过程中,若在SelectDB数据库中增加BE(Backend)节点,可能会导致任务失败。您可以尝试通过重新启动实例,来恢复失败的任务。
在DTS实例运行过程中,请勿在目标SelectDB数据库中新建集群,否则会导致DTS实例运行失败。您可以尝试通过重新启动实例,来恢复失败的任务。
只支持将数据同步或迁移到SelectDB数据库的Unique或Duplicate引擎表。若目标表为Duplicate引擎表,以下情况均可能会导致目标库中出现重复数据,您可以自行根据附加列(_is_deleted、_version和_record_id)进行去重操作:
DTS实例发生过重试操作。
DTS实例执行过重启操作。
DTS实例开始运行后,待同步或迁移的同一条数据执行过两次或更多次DML操作。
说明当目标表为Duplicate引擎表时,DTS会将UPDATE或DELETE语句转换为INSERT语句。
由于SelectDB数据库仅支持以字母开头的库名和表名,如果待同步或迁移的库名或表名不是以字母开头,则需要使用映射功能进行修改。
若待同步或迁移对象(库、表、列)的名称包含中文,则需要使用映射功能进行修改(例如将其修改为英文),否则可能会导致任务失败。
在SelectDB数据库中,
VARCHAR(N)
类型的N表示字节长度。若DTS实例不含库表结构任务,建议您将SelectDB数据库中VARCHAR类型字段的长度设置为源库VARCHAR字段长度的四倍。
PolarDB分布式版
PolarDB-X 1.0
不支持同步或迁移DDL操作。
PolarDB-X 2.0
PolarDB-X 2.0实例需兼容MySQL 5.7版本。
大数据计算
MaxCompute
已准备主账号的AccessKey信息(AccessKey Id和AccessKey Secret)。获取方式,请参见创建AccessKey。
需手动设置MaxCompute白名单,允许DTS访问MaxCompute。更多信息,请参见设置阿里云产品访问MaxCompute白名单。
已创建MaxCompute项目。更多信息,请参见创建MaxCompute项目。
DataHub
存储
Tablestore
源库待同步或迁移的表数量符合Tablestore实例的限制(不超过64个)。如业务确实会超过此限制,请为目标Tablestore实例放开此限制。
源库待同步或迁移的表或列名称符合Tablestore实例的命名规范:
表或列的名称由大小写字母、数字或下划线(_)组成,且只能以字母或下划线开头。
表或列的名称长度为1~255个字符。
中间件
Kafka
若Kafka实例的接入方式为云实例,则不支持库表结构任务。
若阿里云消息队列Kafka版实例的Broker数量大于3个,需以专线/VPN网关/智能网关的方式接入DTS。
DTS实例运行期间,若目标Kafka发生了扩容或缩容(如增加或减少Kafka的Broker节点),需要重启DTS实例。
集群部署在ECS实例的Kafka实例,除了控制台选择的ECS实例,其他ECS实例均需要手动添加DTS服务的IP地址段。
其他数据库
SQL Server
不支持同步或迁移TIMESTAMP、CURSOR、ROWVERSION、SQL_VARIANT、HIERARCHYID、POLYGON、GEOMETRY和GEOGRAPHY类型的数据。
若DTS实例包含增量任务,请禁用目标库中已启用的触发器和外键,否则会导致DTS实例运行失败。
Oracle
需确保源库和目标库的字符集兼容,否则可能会导致数据不一致或实例运行失败。
若DTS实例包含增量任务,请禁用目标库中已启用的触发器和外键,否则会导致DTS实例运行失败。
源库和目标库的时区必须保持一致。
更多信息,请参见Oracle为目标。
函数计算FC
仅支持作为同步实例的目标库。
不支持映射功能。
不支持跨地域的同步实例。
若DTS实例包含全量同步,则目标函数的并发度不能太小。调整函数并发度的操作,请参见设置实例并发度。
若源库待同步的数据中,单条数据不能超过16 MB,否则DTS任务会因无法将数据写入到函数计算FC而产生报错。若您需要同步部分字段,可以使用ETL功能过滤大字段的数据。
请避免多个DTS任务同步到同一个目标函数,建议不同任务使用不同的函数进行数据隔离,否则可能会造成目标端数据混乱。
Doris
在DTS实例运行过程中,若在Doris数据库中增加BE(Backend)节点,可能会导致任务失败。您可以尝试通过重新启动实例,来恢复失败的任务。
在DTS实例运行过程中,请勿在目标Doris数据库中新建集群,否则会导致DTS实例运行失败。您可以尝试通过重新启动实例,来恢复失败的任务。
只支持将数据同步或迁移到Doris数据库的Unique或Duplicate引擎表。若目标表为Duplicate引擎表,以下情况均可能会导致目标库中出现重复数据,您可以自行根据附加列(_is_deleted、_version和_record_id)进行去重操作:
DTS实例发生过重试操作。
DTS实例执行过重启操作。
DTS实例开始运行后,待同步或迁移的同一条数据执行过两次或更多次DML操作。
说明当目标表为Duplicate引擎表时,DTS会将UPDATE或DELETE语句转换为INSERT语句。
由于Doris数据库仅支持以字母开头的库名和表名,如果待同步或迁移的库名或表名不是以字母开头,则需要使用映射功能进行修改。
若待同步或迁移对象(库、表、列)的名称包含中文,则需要使用映射功能进行修改(例如将其修改为英文),否则可能会导致任务失败。
在Doris数据库中,
VARCHAR(N)
类型的N表示字节长度。若DTS实例不含库表结构任务,建议您将Doris数据库中VARCHAR类型字段的长度设置为源库VARCHAR字段长度的四倍。