目标库的注意事项及限制

本文为您介绍不同类型数据库作为目标库时的限制,以帮助您提前了解相关注意事项及DTS功能的限制,从而有效减少实例异常的发生。

通用限制

所有类型的数据库在作为目标库时,均存在以下限制条件:

  • 请确保标库处于正常运行的状态。

  • 请确保目标库有足够的空间存储数据。

  • 请确保DTS服务的IP地址段能够被自动或手动添加至目标库的安全设置中,以允许DTS服务器的访问。更多信息,请参见添加DTS服务器的IP地址段

数据库类型限制

不同类型的数据库作为目标库时,存在不同的限制条件,具体详情如下所示。

  • MySQL系列数据库

    MySQL

    • 若您将列名仅大小写不同的字段写入到目标MySQL数据库的同一个表中,可能会因为MySQL数据库列名大小写不敏感,导致同步结果不符合预期。

    • 在数据同步完成后,建议使用analyze table <表名>命令以确认数据均已写入目标表。例如,在MySQL触发HA切换机制后,可能会导致数据只写到了内存,从而造成数据丢失。

    • 若目标库的DDL写入失败,DTS任务会继续运行,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志

    • 若RDS MySQL实例已开通全密态(EncDB)功能,则不支持全量任务。

    • 当目标库为RDS MySQL时,如果待同步或迁移的数据库名称不符合RDS MySQL的定义规范,您需要在配置DTS实例前在RDS MySQL中创建数据库。相关操作,请参见管理数据库

    PolarDB for MySQL

    • 若您将列名仅大小写不同的字段写入到目标MySQL数据库的同一个表中,可能会因为MySQL数据库列名大小写不敏感,导致同步结果不符合预期。

    • 在数据同步完成后,建议使用analyze table <表名>命令以确认数据均已写入目标表。例如,在MySQL触发HA切换机制后,可能会导致数据只写到了内存,从而造成数据丢失。

    • 若目标库的DDL写入失败,DTS任务会继续运行,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志

    MariaDB

    • 若您将列名仅大小写不同的字段写入到目标MySQL数据库的同一个表中,可能会因为MySQL数据库列名大小写不敏感,导致同步结果不符合预期。

    • 在数据同步完成后,建议使用analyze table <表名>命令以确认数据均已写入目标表。例如,在MySQL触发HA切换机制后,可能会导致数据只写到了内存,从而造成数据丢失。

    • 若目标库的DDL写入失败,DTS任务会继续运行,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志

  • 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的连接地址发生变化,则需要重新配置任务。

    • 在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

    • 云数据库ClickHouse的时间类型数据存在范围限制,若源库中的时间不在该范围内,会导致迁移到云数据库ClickHouse的时间不正确。范围限制,请参见时间信息

    • 待同步或迁移数据库的数量符合云数据库ClickHouse的限制,即不超过256个。

    • 待同步或迁移数据库、表和列的名称符合云数据库ClickHouse的命名规范,相关规范请参见使用限制

    • 不支持同步或迁移RENAME TABLE的操作。

    Elasticsearch

    • 不支持开发测试型规格的Elasticsearch实例。

    • 不支持同步或迁移DDL,如果源库中待同步或迁移的表需要执行增加列的操作,您只需先在Elasticsearch实例中修改对应表的mapping,然后在源库中执行相应的DDL操作,最后暂停并启动DTS同步实例。

    • 若同步至Elasticsearch实例的数据包含空字符,则会转换成LONG类型的数据写入Elasticsearch实例,从而导致任务失败。

    • 若同步或迁移至Elasticsearch实例的数据包含位置信息,且经纬度反向存储,将数据写入Elasticsearch实例时会报错。

    SelectDB

    • 在DTS实例运行过程中,若在SelectDB数据库中增加或减少BE(Backend)节点,需要重启DTS实例。

    • 在DTS实例运行过程中,请勿在目标SelectDB数据库中新建集群,否则会导致DTS实例运行失败。

    • 只支持将数据同步或迁移到SelectDB的Unique引擎表。

    • 由于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

    DataHub

    • 目标DataHub中单个String字段的长度最大支持2 MB。

    • 仅支持表级别的数据同步或迁移,不支持同步或迁移源库新增列的操作。

    • 已开通DataHub服务,并已创建用于接收同步数据的Project。具体操作请参见快速入门Project操作

  • 存储

    Tablestore

    • 源库待同步或迁移的表数量符合Tablestore实例的限制(不超过64个)。如业务确实会超过此限制,请为目标Tablestore实例放开此限制。

    • 源库待同步或迁移的表或列名称符合Tablestore实例的命名规范:

      • 表或列的名称由大小写字母、数字或下划线(_)组成,且只能以字母或下划线开头。

      • 表或列的名称长度为1~255个字符。

  • 中间件

    Kafka

    • 若的Kafka接入方式云实例,不支持库表结构任务。

    • 若Broker数量大于3个,需以专线/VPN网关/智能网关的方式接入DTS。

    • DTS实例运行期间,若目标Kafka发生了扩容或缩容(如增加或减少Kafka的Broker节点),需要重启DTS实例。

    • 部署在ECS实例的Kafka集群,除了控制台选择的ECS实例,其他ECS实例均需要手动添加DTS服务的IP地址段。

  • 其他数据库

    SQL Server

    若DTS实例包含增量任务,请禁用目标库中已启用的触发器和外键,否则会导致DTS实例运行失败。

    Oracle

    • 需确保源库和目标库的字符集兼容,否则可能会导致数据不一致或实例运行失败。

    • 源库和目标库的时区必须保持一致。

    • 更多信息,请参见Oracle为目标

    函数计算FC

    • 仅支持作为同步实例的目标库。

    • 不支持映射功能。

    • 不支持跨地域的同步实例。

    • 若DTS实例包含全量同步,则目标函数的并发度不能太小。调整函数并发度的操作,请参见设置实例并发度

    • 若源库待同步的数据中,单条数据不能超过16 MB,否则DTS任务会因无法将数据写入到函数计算FC而产生报错。若您需要同步部分字段,可以使用ETL功能过滤大字段的数据。

    • 请避免多个DTS任务同步到同一个目标函数,建议不同任务使用不同的函数进行数据隔离,否则可能会造成目标端数据混乱。

    Doris

    • 在DTS实例运行过程中,若在Doris数据库中增加或减少BE(Backend)节点,需要重启DTS实例。

    • 在DTS实例运行过程中,请勿在目标Doris数据库中新建集群,否则会导致DTS实例运行失败。

    • 只支持将数据同步或迁移到Doris的Unique引擎表。

    • 由于Doris数据库仅支持以字母开头的库名和表名,如果待同步或迁移的库名或表名不是以字母开头,则需要使用映射功能进行修改。

    • 若待同步或迁移对象(库、表、列)的名称包含中文,则需要使用映射功能进行修改(例如将其修改为英文),否则可能会导致任务失败。

    • 在Doris数据库中,VARCHAR(N)类型的N表示字节长度。若DTS实例不含库表结构任务,建议您将Doris数据库中VARCHAR类型字段的长度设置为源库VARCHAR字段长度的四倍。