MySQL为源:数据同步使用限制

为了确保您的数据同步任务稳定、高效且结果准确,请在开始操作前仔细阅读本指南。了解这些使用限制,是保障项目成功的关键。

通用限制

无论您的源库或目标库是什么类型,以下网络和业务负载限制都直接影响任务的稳定性和性能。

限制项

说明

网络配置

  • 源库网络带宽:须大于等于 100 Mb/s。

  • 网络延迟(RTT):为保证同步性能,源库与DTS服务之间的网络RTT(Round-Trip Time)应小于2毫秒。跨地域或跨国部署时,物理距离(例如,部署在新加坡地域的数据库,通过部署在中国香港地域的VPN接入到DTS)可能导致RTT超标,从而引起同步延迟。

业务负载

  • 日志量:DTS通过拉取数据库日志实现增量同步。为保证稳定性,建议源库实例的日志量峰值小于1 TB/天,平均每小时日志量小于50 GB,峰值流量小于15 MB/s。

    重要

    DTS默认情况下会拉取整个数据库的日志,而不仅仅是同步对象的日志。这意味着,即使仅同步一张小表,数据库中其他无关的大表的频繁写入(产生大量日志)仍会导致同步任务的延迟。因此,在规划时,请务必充分考虑这一影响。

  • 批量更新:在执行批量数据更新或对大字段(如CLOB、BLOB、LONG等类型)进行大规模变更时,可能会导致任务延迟。因此,建议将此类操作分批进行,或尽量避免执行。

  • 高频DDL:避免频繁执行DDL操作,建议每秒不超过10条,否则可能导致任务延迟。

  • 无主键表:避免对无主键表进行频繁的DELETEUPDATE操作,否则可能导致任务延迟。

  • 大事务:避免执行单个日志量超过100 GB的大事务,否则可能导致任务失败。

跨账号与跨境

  • 跨账号同步:是否支持创建跨账号同步任务,取决于具体的数据库类型和接入方式。详情参见配置跨阿里云账号的任务

  • 跨境数据同步:该功能未默认开放。需先提交申请跨境数据同步权限并通过审核后方可使用。

    说明
    • 如您配置的同步/迁移任务涉及跨境和跨地域操作。请确保您的任务带宽不超过100 Mbit/s,若您的带宽超过100 Mbit/s,请您自行使用CEN配置跨地域网络带宽,并配置DTS任务。

    • 跨地域或跨境任务指的是您在DTS控制台上配置的任务,例如源库为新加坡区域RDS,目标库为华东1(杭州)区域RDS。

其他

若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。

说明

在调整参数时,仅会修改DTS实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。

源库限制

当源库为MySQL系列数据库时,您需要关注以下限制。

限制项

说明

同步前

  • 账号权限

    • 自建MySQL:

      • 需提供至少拥有待同步对象的SELECT权限。

      • REPLICATION SLAVEREPLICATION CLIENTSHOW VIEW权限。

      • 建库建表权限,以允许DTS在源库定时执行CREATE DATABASE IF NOT EXISTS `test`命令以推进Binlog位点。

    • RDS MySQL:需提供拥有读写权限的账号。

  • 账号同步:若您需要同步源库中的账号,则还需满足相应的前提条件,并了解相关注意事项。更多信息,请参见迁移数据库账号

  • 主键或唯一键:所有待同步的表都需具备主键或唯一约束,且字段值唯一,否则可能导致目标端数据重复。

    说明

    支持双向同步的链路(如MySQLMySQL),可在任务中开启Exactly-Once写入功能,帮助您将既无主键也无唯一约束的表的全量和增量数据准确地同步到目标表。更多信息,请参见同步无主键和唯一约束的表

  • Binlog配置

    • 需开启Binlog。

    • binlog_row_image需为FULL

    • 源库为自建MySQL时:

      • binlog_format需为ROW

      • 若源库为双主或级联复制架构,为保障DTS能获取全部的Binlog日志,则您需开启参数log_slave_updates

  • Binlog保留时长:自建MySQL建议保留7天以上,RDS MySQL建议保留3天以上。否则DTS可能会因无法获取Binlog而导致任务失败,极端情况下甚至可能会导致数据不一致或数据丢失。由于您所设置的Binlog日志保存时间低于DTS要求的时间而导致的问题,不在DTSSLA保障范围内。

  • 隐藏列:若源库为MySQL 8.0.23及以上版本,请确保没有需要同步的隐藏列(Invisible Columns),或使用ALTER TABLE ... ALTER COLUMN ... SET VISIBLE;将其设为可见。无主键表自动生成的隐藏主键也需设为可见。否则可能会因为无法获取该列的数据而导致数据丢失。

  • 版本兼容性:建议源和目标库版本保持一致,或者从低版本同步到高版本以保障兼容性。如为高版本同步至低版本,可能存在数据库兼容性问题。

  • 表数量限制:若同步对象为表级别且需要编辑(如列名映射),单任务最多支持1000张表。当超出数量限制,任务提交后会显示请求报错,此时建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务。

  • 不支持的源库

    • 不记录事务日志的实例(如RDS MySQL 5.6的只读实例)不支持作为源库。

    • 若源RDS MySQL实例已开通全密态功能,则不支持全量同步。透明数据加密(TDE)功能则不受影响。

  • 集群读写节点:若源库为Amazon Aurora MySQL或其他集群模式的MySQL实例,请确保DTS连接的是始终可用的读写(RW)节点。否则可能会导致同步任务无法正常运行。

同步期间

  • 性能影响:执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量同步初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。

  • 禁止在初始阶段执行DDL:在库表结构同步全量同步期间,请勿执行库或表结构变更的DDL操作,否则会导致数据同步任务失败。

    说明

    在全量同步阶段,DTS将对源库进行查询,这将产生元数据锁,从而可能阻碍源数据库的DDL操作执行。

  • 不支持的DDL类型:不支持同步使用注释语法定义的解析器(Parser)以及临时表模式的Online DDL(包括但不限于多表合并场景),则可能导致目标库数据丢失或同步任务运行失败。

  • 无法同步未记录Binlog的操作:任何不写入Binlog的操作(如外键级联更新/删除、通过物理备份恢复数据等)所产生的数据变更,DTS无法感知,因此不会被同步。

    说明

    若有该情况,您可以在业务允许的前提下,通过修改同步对象功能,移除该数据所属的库表,然后将该数据所属的库表重新添加到待同步对象。更多信息,请参见修改同步对象

  • Online DDL工具限制:同步期间,如果同步对象为单个或多个表(非整库),请勿对源库的同步对象使用pt-online-schema-change等类似工具执行在线DDL变更,否则会导致同步失败。

  • 源库主备切换:若自建MySQL发生主备切换,将导致同步任务失败。

  • 延迟时间:由于DTS的延迟时间是根据同步到目标库最后一条数据的时间戳和当前时间戳对比得出,源库长时间未执行DML操作可能导致延迟信息不准确。如果任务显示的延迟时间过大,您可以在源库执行一个DML操作来更新延迟信息。

    说明

    如果同步对象选择为整库,您还可以创建心跳表,心跳表每秒定期更新或者写入数据。

双向同步额外限制

  • 自动全量校验:当双向同步任务位于特定地域(华东1(杭州)、华南1(深圳)或华南3(广州)地域)且包含全量同步DTS默认会为该全量同步任务创建全量校验模式按表行数进行校验的全量校验任务。若您已自行配置全量校验任务,则以您所配置的全量校验任务为准。

  • 防数据循环:为防止数据循环同步,DTS会在正向任务和反向任务的目标库中自动创建dts数据库。以避免数据循环同步。在任务运行期间,请勿修改该数据库,并确保任务使用的数据库账号具备该库的读写权限。

    说明

    dts库可能会影响MySQL正常的主备同步,建议检查备库中是否存在dts库及相关表。若不存在,您需按照主库中dts的库表结构手动在备库中创建。

  • 单向全量初始化:配置双向同步任务时,若其中一个任务的目标对象是另一个任务待同步的对象:

    • 仅允许一个方向的任务执行全量同步增量同步。另一个方向的任务仅支持增量同步,以确保数据初始化的正确性。

    • 当前任务的源数据仅支持同步到当前任务的目标端,同步过来的数据不会作为另一个任务的源数据继续同步。

  • log_slave_updates配置:若您的自建MySQL同时作为双向同步和其他DTS任务的源库,您需要在其配置文件中设置log_slave_updates=1并重启数据库。这能确保从另一端同步回来的数据变更被记入Binlog,从而被其他任务正常捕获,保障数据都一致性。

目标库限制

请根据您的目标库类型,仔细核对相应的注意事项。

RDS MySQL

限制项

说明

同步前

  • 存储空间:目标RDS MySQL实例的可用存储空间,需大于源库待同步库表所占用的空间。

  • 实例规格与字符集:若待同步的数据中包含需要四字节存储的内容(例如生僻字、表情等信息),需将目标实例参数character_set_server设为utf8mb4

  • 全密态(EncDB)限制:若目标RDS MySQL实例已开通全密态功能,则不支持全量同步。透明数据加密(TDE)功能则不受影响。

  • 账号权限:需提供拥有读写权限的账号。

  • 字段兼容性:若您在配置任务时未选择库表结构同步,则需自行保障源库与目标库的字段类型兼容。例如,将源库的TEXT类型字段同步到目标库的VARCHAR(255)字段,可能因长度不足导致数据被截断。

同步期间

  • 性能影响:执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量同步初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。

  • 禁止外部写入:同步期间,严禁任何非DTS的程序或个人向目标库写入数据,否则将导致数据冲突和不一致。

  • 主键/唯一键冲突处理

    • 表结构一致时:

      • 全量同步期间:若目标库已存在某条记录,DTS会保留目标库的记录,跳过源库的对应记录。

      • 增量同步期间:若目标库存在冲突记录,DTS会用源库的记录覆盖目标库的记录。

    • 表结构不一致时:可能会导致无法初始化数据、只能同步部分列的数据或同步失败,请谨慎操作。

  • DDL失败处理:若同步的DDL在目标库执行失败,DTS任务会记录失败日志但继续同步DML,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志

  • 大小写敏感:若您将仅大小写不同的列名写入同一张表,可能因MySQL默认的大小写不敏感策略导致结果不符合预期。

  • 外键与约束

    • 库表结构同步期间,DTS会将源数据库中的外键同步到目标数据库。

    • 全量同步增量同步期间,DTS会以Session级别暂时禁用约束检查以及外键级联操作。若任务运行时源库存在级联更新、删除操作,可能会导致数据不一致。

  • 数据完整性校验:数据同步完成后(任务的运行状态已完成),建议在目标库执行ANALYZE TABLE <表名>命令,以确认数据均已写入目标表。此操作尤其重要,因为在某些异常情况(如目标库发生HA切换)下,数据可能仅停留在内存中,执行该命令有助于及时发现并防止数据丢失。

  • 表空间增长全量同步期间,DTS通过高并发INSERT写入数据,这可能导致目标表产生内部碎片。因此,同步完成后,目标表的空间占用可能会明显大于源表,此为正常现象。

支持的同步SQL

  • DMLINSERTUPDATEDELETE

  • DDL

    • CREATE TABLEALTER TABLEDROP TABLETRUNCATE TABLERENAME TABLE

    • CREATE VIEWALTER VIEW

    • CREATE INDEXDROP INDEX

    • CREATE PROCEDURECREATE FUNCTION

说明
  • 对仅作为部分同步对象的表执行RENAME TABLE,可能导致重命名后该表的数据不再被同步。为避免此问题,建议将该表所属的整个数据库作为同步对象,且确保RENAME TABLE操作前后的表所属的数据库均在同步对象中。

  • 双向同步的链路:仅正向任务(即源库同步至目标库)支持同步DDL,反向任务(即目标库同步至源库)不支持同步DDL,将自动过滤DDL操作。

消息队列 Kafka

限制项

说明

同步前

  • Topic准备:需在目标Kafka实例中提前创建用于接收数据的Topic。请参见步骤一:创建Topic

  • 存储空间:确保目标Kafka实例的可用存储空间大于源库占用的空间。

  • 避免同步大字段:为防止消息体超限或引发性能问题,建议在配置同步任务时,不要同步非必要的大字段列(如TEXT、BLOB等)。

同步期间

  • 单条记录大小限制:受目标端Kafka限制,每条消息会有单条消息大小上限(自建Kafka可以通过查看max.message.bytes设置,云实例Kafka可以在对应控制台上查看)。若源库某一行数据序列化后超过此限制,将导致任务中断。建议通过配置任务过滤掉包含超大字段的列,或不同步该表。如果一定要同步,也只能同步部分列,即配置DTS任务时,过滤掉这些大字段的记录。如果已经是在同步中的任务,则需要修改同步对象,将该表移出,再次点击修改同步对象,加入该表,并将该表的大字段列过滤,不做同步。

  • 禁止外部写入:同步期间,严禁任何非DTS的程序向目标Topic写入数据,否则会导致数据不一致。

  • Kafka集群伸缩:如果目标Kafka集群在同步期间发生扩容或缩容,您需要重启DTS同步任务。

  • 表空间增长全量同步期间,DTS通过高并发INSERT写入数据,这可能导致目标表产生内部碎片。因此,同步完成后,目标表的空间占用可能会明显大于源表,此为正常现象。

支持的同步SQL

  • DMLINSERTUPDATEDELETE

  • DDL

    • CREATE TABLEALTER TABLEDROP TABLETRUNCATE TABLERENAME TABLE

    • CREATE VIEWALTER VIEWDROP VIEW

    • CREATE PROCEDUREALTER PROCEDUREDROP PROCEDURE

    • CREATE FUNCTIONDROP FUNCTIONCREATE TRIGGERDROP TRIGGER

    • CREATE INDEXDROP INDEX

说明

同步到KafkaDDL也是消息类型,具体格式参考消息队列中的数据存储格式

AnalyticDB MySQL 3.0

限制项

说明

同步前

  • 主键要求:目标库中需存在自定义主键,或者在库表列配置阶段配置主键列,否则可能会导致数据同步失败。

  • 实例状态

    • 若目标AnalyticDB MySQL 3.0的磁盘使用率超过80%,DTS任务会因无法写入而异常。请提前根据待同步的对象预估所需空间,确保目标集群具备充足的存储空间。

    • 若目标AnalyticDB MySQL 3.0处于备份中的状态,DTS任务会失败。

  • 不支持前缀索引:源库中不能存在前缀索引,否则可能导致同步失败。

同步期间

  • 性能影响:执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量同步初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。

  • 禁止外部写入:同步期间,严禁任何非DTS的程序或个人向目标库写入数据,否则将导致数据冲突和不一致。

  • 主键/唯一键冲突处理

    • 表结构一致时:

      • 全量同步期间:若目标库已存在某条记录,DTS会保留目标库的记录,跳过源库的对应记录。

      • 增量同步期间:若目标库存在冲突记录,DTS会用源库的记录覆盖目标库的记录。

    • 表结构不一致时:可能会导致无法初始化数据、只能同步部分列的数据或同步失败,请谨慎操作。

  • 表空间增长全量同步期间,DTS通过高并发INSERT写入数据,这可能导致目标表产生内部碎片。因此,同步完成后,目标表的空间占用可能会明显大于源表,此为正常现象。

  • DDL失败处理:若同步的DDL在目标库执行失败,DTS任务会记录失败日志但继续同步DML,您需要在任务日志中查看执行失败的DDL。查看任务日志的方法,请参见查询任务日志

  • DDL操作限制

    • 同步期间,请勿对源库执行修改主键或添加表注释的DDL操作(如ALTER TABLE table_name COMMENT='表的注释';),否则数据同步过程中会导致该DDL执行失败。

    • 对于表级别的数据同步,如果没有除DTS以外的数据写入目标库,您可以使用数据管理DMS(Data Management)来执行在线DDL变更,请参见不锁表结构变更

支持的同步SQL

  • DMLINSERTUPDATEDELETE

    说明

    在数据写入到AnalyticDB MySQL 3.0时,UPDATE语句会自动转换为REPLACE INTO。若更新的是主键,则会转换为DELETE + INSERT

  • DDL

    • CREATE TABLEDROP TABLERENAME TABLETRUNCATE TABLE

    • ADD COLUMNMODIFY COLUMNDROP COLUMN

说明
  • 对仅作为部分同步对象的表执行RENAME TABLE,可能导致重命名后该表的数据不再被同步。为避免此问题,建议将该表所属的整个数据库作为同步对象,且确保RENAME TABLE操作前后的表所属的数据库均在同步对象中。

  • 不支持同步INDEXPARTITIONVIEWPROCEDUREFUNCTIONTRIGGERFK

重要

如果在数据同步过程中变更了源表的字段类型,同步任务将报错并中断。您可以参照以下方法手动修复。

  1. 在同步至目标库AnalyticDB MySQL 3.0时,源表(customer)因字段类型变更而导致同步任务失败。

  2. AnalyticDB MySQL 3.0中创建一个新表(customer_new),表结构与customer表保持一致。

  3. 通过INSERT INTO SELECT命令,将customer表的数据复制并插入到新创建的customer_new表中,确保两张表的数据保持一致。

  4. 重命名或删除同步失败的表customer,然后将customer_new表的名称修改为customer

  5. DTS控制台,重新启动数据同步任务。