操作场景
数据传输服务 DTS 支持两个数据库之间的双向数据同步,可应用于异地多活场景。双向同步通过创建两个单向同步任务来构建双向的拓扑,支持在同步过程中,两个数据库实例同时写入数据。
注意事项
DTS 在执行全量数据同步时,会占用一定源端实例资源,可能会导致源实例负载上升,增加数据库自身压力。如果您数据库配置过低,建议您在业务低峰期进行。
为了避免数据重复,请确保需要同步的表具有主键或者非空唯一键,对于没有主键或者非空唯一键的表,有数据重复的风险。
用户应提前规划好数据,两个源端负责更新(增、删、改)不同主键的数据,避免主键冲突或者相同主键数据互相覆盖等情况。例如 A 数据库上更新1,3,5的主键数据,B 数据库上更新2,4,6的主键数据。如果因为业务原因,两个源端负责的主键存在交叉,需要参考 推荐配置,选择合理的冲突策略,使同步行为和数据符合预期。
提前准备好目标数据库,并对执行同步任务的账号 授权源库和目标库的对应权限。
应用限制
双向同步最多仅支持在一个方向进行 DDL,同步链路不能形成环路(正向同步、反向同步只能选择一个进行 DDL)。
仅 MySQL/TDSQL-C MySQL/MariaDB/Percona/TDSQL MySQL/PostgreSQL 相互之间的同步连接支持双向同步。
源端或者目标端有 MyISAM 引擎的表时,不支持构建双向同步任务,否则会形成数据回环。
典型场景推荐配置
典型场景推荐配置
双向同步是通过创建两个单向同步任务来构建双向拓扑,每个单向同步的步骤与普通的单向同步的步骤类似,只是在如下同步选项设置上有差异。

如下列出了典型场景的推荐配置,请用户参考操作。
场景 | 时间要求 | 同步任务 | 初始化类型 | 已存在同名表 | 冲突处理机制 | 同步操作类型 |
场景一:实例 A 有库表结构和数据,实例 B 为空 | 需要等任务一进行到“同步增量”阶段再创建任务二 | 任务一:正向同步 A > B | 结构初始化 + 全量数据初始化 | 前置校验并报错 | 请用户自行选择。 示例:如果某个主键发生冲突,用户需要以 A 的内容为准,则任务一选择冲突覆盖,任务二选择冲突忽略或者冲突报错。 | DDL 最多支持在一个任务中选择。 除 DDL 外,其他操作类型两个任务保持一致。 |
| | | | 任务二:反向同步 B > A | 不选择 | 忽略并继续执行 |
| | 场景二:实例 A 有库表结构和数据,实例 B 只有库表结构,无数据 | 无 | 任务一:正向同步 A > B | 全量数据初始化 | 忽略并继续执行 |
| | | | 任务二:反向同步 B > A | 不选择 | 忽略并继续执行 |
| | 场景三:实例 A、B 都有库表结构和数据 | 无 | 任务一:正向同步 A > B | 全量数据初始化 | 忽略并继续执行 |
| | | | 任务二:反向同步 B > A | 全量数据初始化 | 忽略并继续执行 |
操作步骤
本场景以构建上海地域自建 MySQL A 与北京地域腾讯云 MySQL B 的双向同步为例,A 初始状态有库表结构和数据,B 初始状态为空。发生主键冲突时以 A 的更新为准。A > B 的同步,主键冲突策略为冲突覆盖,同步 DDL + DML;B > A 的同步,主键冲突策略为冲突忽略,仅同步 DML。


创建同步任务一:正向同步 A > B
1. 登录 数据同步购买页,选择相应配置,单击立即购买。
参数 | 描述 |
创建模式 | 新建任务:新建一个全新的任务。 创建类似任务:快速创建一个和历史任务相同配置的任务,新的任务中数据库类型、计费模式等默认填充的选项都和历史任务保持一致,用户如果需要也可根据情况进行修改。 |
计费模式 | 支持包年包月和按量计费。 |
源实例类型 | 选择 MySQL,购买后不可修改。 |
源实例地域 | 选择源实例 A 所在地域,购买后不可修改。 |
目标实例类型 | 选择 MySQL,购买后不可修改。 |
目标实例地域 | 选择目的实例 B 所在地域,购买后不可修改。 |
规格 | |
标签 | 给同步任务设置标签键与标签值,便于通过标签高效管理多个任务。 |
任务名 | 选择创建后命名,默认任务名称与任务 ID 一致。在同步任务创建完成之后,可重新设置任务名称。 选择立即命名,在下面输入框,输入任务名称。 |
协议条款 |
2. 购买完成后,返回 数据同步列表,可看到刚创建的数据同步任务,刚创建的同步任务需要进行配置后才可以使用。
3. 在数据同步列表,单击操作列的配置,进入配置同步任务页面。

4. 在设置同步源和目标数据库页面,填写源和目标数据库等信息,然后单击测试连通性,测试连通性后,单击下一步。

设置项 | 参数 | 描述 |
任务设置 | 任务名称 | DTS 会自动生成一个任务名称,用户可以根据实际情况进行设置。 |
| 运行模式 | 支持立即执行和定时执行两种模式。 |
| 自动重试 | 设置后,同步任务因网络异常等引起的任务临时中断,DTS 将在设置的时间范围内自动重试和恢复任务,不需要用户手动操作。 支持设置的时间范围为5分钟 - 720分钟。 |
源实例设置 | 源实例类型 | 购买时所选择的数据库 A 的类型,不可修改。 |
| 源实例地域 | 购买时选择的数据库 A 所在地域,不可修改。 |
| 服务提供商 | 选择“普通”。 |
| 接入类型 | |
目标实例设置 | 目标实例类型 | 购买时选择的目标数据库 B 的类型,不可修改。 |
| 目标实例地域 | 购买时选择的目标数据库 B 所在地域,不可修改。 |
| 接入类型 | 本场景选择“云数据库”。 |
| 实例 ID | 数据库 B 的实例 ID。 |
| 账号 | 数据库 B 的账号,账号权限需要满足要求。 |
| 密码 | 数据库 B 的密码。 |
5. 在设置同步选项和同步对象页面,将对数据初始化选项、数据同步选项、同步对象选项进行设置,在设置完成后单击保存并下一步。


设置项 | 参数 | 描述 |
数据初始化选项 | 初始化类型 | 本场景选择结构初始化 + 全量数据初始化。 结构初始化:同步任务执行时会先将源实例中表结构初始化到目标实例中。 全量数据初始化:同步任务执行时会先将源实例中数据初始化到目标实例中。 |
| 已存在同名表 | 本场景选择前置校验并报错。 前置校验并报错:存在同名表则报错,流程不再继续。 忽略并继续执行:全量数据和增量数据直接追加到目标实例的表中。 |
数据同步选项 | 冲突处理机制 | 根据业务情况自行选择,本场景选择冲突覆盖。 冲突报错:在同步时发现表主键冲突,报错并暂停数据同步任务。 冲突忽略:在同步时发现表主键冲突,保留目标库主键记录。 冲突覆盖:在同步时发现表主键冲突,用源库主键记录覆盖目标库主键记录。 |
| 同步操作类型 | 支持操作:Insert、Update、Delete、DDL。打开 “DDL 自定义”,可以根据需要选择不同的 DDL 同步策略。详情请参考 设置 SQL 过滤策略。双向同步最多支持在一个同步任务中选择 DDL。本场景在任务一中选择 DDL,在任务二中不选择。 |
同步对象选项 | 同步对象 | 整个实例:同步整个实例。 指定对象:同步指定对象。 |
| 高级迁移对象 | 选择待同步的对象,支持基础库表、视图、存储过程和函数。高级对象的同步是一次性动作,仅支持同步在任务启动前源库中已有的高级对象,在任务启动后,新增的高级对象不会同步到目标库中。更多详情,请参考 同步高级对象。 |
| 已选对象 | 支持库表映射(库表重命名),将鼠标悬浮在库名、表名上即显示编辑按钮,单击后可在弹窗中填写新的名称。 选择高级对象进行同步时,建议不要进行库表重命名操作,否则可能会导致高级对象同步失败。 |
| 是否同步 Online DDL 临时表 | 如果使用 gh-ost、pt-osc 工具对源库中的表执行 Online DDL 操作,DTS 支持将 Online DDL 变更产生的临时表同步到目标库。 勾选 gh-ost,DTS 会将 gh-ost 工具产生的临时表名(`_表名_ghc`、`_表名_gho`、`_表名_del`)同步到目标库。 勾选 pt-osc, DTS 会将 pt-osc 工具产生的临时表名(`_表名_new`、 `_表名_old`)同步到目标库。 |
高级选项 | 限制传输速率 | |
6. 在 A > B 的正向同步任务中,DTS 会进行源库和目标库参数校验。完成校验并全部校验项通过后,单击启动任务。在 B > A 的反向同步任务中,DTS 还会增加 DDL 校验。
DDL 校验


说明:
如果环形链路未形成 DDL 冲突,则不会出现上述校验失败问题。
源库和目标库参数校验

7. 返回数据同步任务列表,任务开始进入运行中状态。


创建同步任务二:反向同步 B > A
正向同步和反向同步操作基本一致,以下仅对差异点进行详细说明。
1. 确定任务一的状态,在任务一进行到“同步增量”阶段,再开始配置任务二。
这个时间要求,仅对 B 数据为空的场景,其他场景不需要等待。


2. 设置同步源和目标数据库。
本步骤中的源和目标数据需要与任务一中的数据进行互换。


3. 设置同步选项和同步对象。
初始化类型:不选择。
已存在同名表:忽略并继续执行。
主键冲突处理机制:根据业务情况自行选择,本场景选择冲突忽略。
同步操作类型:双向同步仅支持在一个同步任务中选择 DDL。本场景在任务一中选择 DDL,在任务二中不选择。

4. 在校验任务页面,进行 DDL 校验。


结束同步任务
如不需要同步任务,可选择操作列的更多 > 结束,关闭同步任务。