方案概览
本方案适用于腾讯云上 MySQL 生产实例搭建灾备架构的场景。通过 DTS 数据同步(全量+增量)将主库 A 实时同步至灾备库 B,主库故障时快速切换至灾备库。切换后根据主库 A 的恢复情况,搭建 B→A 反向同步链路切回 A,或为新主库 B 搭建 B→C 灾备同步链路,确保灾备能力不中断。
方案架构
业务场景
MySQL 生产实例已在腾讯云上稳定运行,但缺少灾备架构。当实例所在可用区发生基础设施故障、数据库主节点出现不可恢复的异常、或因运维操作失误导致数据损坏时,业务中断时间完全取决于故障修复或数据恢复的速度,RTO 不可控。
本方案推荐使用 DTS 数据同步链路将主库 A 的全量 + 增量数据实时同步至灾备库 B。灾备库 B 平时不对外提供服务,仅作为 A 的热备副本——数据延迟通常在秒级。当主库 A 发生故障时,结束 A→B 同步任务并将业务切换至 B。
切换至 B 后,根据主库 A 的恢复情况选择不同的后续操作:
A 可恢复(灾备演练、计划内维护、临时故障等):搭建 B→A 反向同步链路,数据追平后将业务切回 A。
A 不可恢复(可用区级故障、数据严重损坏等):为新主库 B 搭建 B→C 灾备同步链路,确保灾备能力不中断。
架构图

方案优势
RPO 趋近于 0:灾备库实时保持与主库数据一致,基于 Binlog 的增量同步延迟通常在秒级,切换时数据丢失最小化。
RTO 可控:切换流程明确,结束同步任务后即可将业务指向灾备库,RTO 可控制在分钟级。
灾备不断档:切换完成后可快速重建灾备链路(反向同步或新建灾备),灾备能力不存在空窗期。
支持异地容灾:灾备库可部署在不同地域,满足跨地域容灾合规要求。
双向同步能力:MySQL 链路内置破环机制,支持双向同步,灵活应对灾备切换和回切场景。
对源库影响小:默认无锁方式同步,增量阶段仅一个连接监听 Binlog,对源库性能几乎无影响。
前提条件
已注册腾讯云账号并完成实名认证。
源数据库和目标数据库符合 DTS 同步功能和版本要求,请参见 MySQL/MariaDB/Percona 同步至 MySQL 使用说明。
已根据接入类型完成网络打通(公网/专线/VPN/云联网),请参见 准备工作概述。
已在源端和目标端创建满足权限要求的数据库账号。
在源数据库中对执行任务账号进行授权,参考如下:
-- 方式一:简化授权GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES,SHOW VIEW,PROCESS,SELECT ON *.* TO '账号'@'%' IDENTIFIED BY '密码';GRANT ALL PRIVILEGES ON `__tencentdb__`.* TO '账号'@'%';FLUSH PRIVILEGES;
-- 方式二:分步授权-- (1) 创建执行任务账号CREATE USER '账号'@'%' IDENTIFIED BY '密码';-- (2) 授予权限GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,REPLICATION SLAVE,SHOW VIEW,PROCESS ON *.* TO '账号'@'%';GRANT ALL PRIVILEGES ON `__tencentdb__`.* TO '账号'@'%';-- (3) 授权 SELECT 权限(选择整个实例同步时授权所有对象)GRANT SELECT ON *.* TO '账号';-- (4) 刷新权限FLUSH PRIVILEGES;
目标库账号需要具备以下权限:
ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES,CREATE USER, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT,LOCK TABLES, PROCESS, REFERENCES, RELOAD, SELECT, SHOW DATABASES,SHOW VIEW, TRIGGER, UPDATE
注意事项
DTS 执行全量数据同步时会占用源端实例资源,可能导致源实例负载上升,建议在业务低峰期执行。以 8 核 16G 规格为例,全量导出阶段约占用 18%-45% CPU、增加约 40-60MB/s 查询压力;增量阶段仅一个连接监听 Binlog,基本无压力。
默认采用无锁方式,同步过程中对源库不加全局锁(FTWRL),仅对无主键的表加表锁。
DTS 会在源库中写入系统库
__tencentdb__,用于记录数据对比信息。占用空间极小(约为源库存储空间的千分之一到万分之一),对源库性能几乎无影响。同步任务结束后不会自动删除该系统库,请勿手动删除。同步过程中请勿修改或删除源端和目标端的数据库用户信息(包括用户名、密码和权限)及端口号。
请勿在源库上执行清除 Binlog 的操作。
建议源库开启 GTID,避免 HA 切换时导致增量同步中断。非 GTID 实例发生 HA 切换可能导致 DTS 增量同步中断。
MySQL 链路支持双向同步(内置破环机制),但灾备场景中建议任何时刻仅一端写入,避免数据冲突。
建议同步有主键或者非空唯一键的表,以避免数据重复。
只支持同步 InnoDB、TokuDB、RocksDB 三种数据库引擎的表。
操作步骤概要
1. 创建灾备同步任务(A→B),初始化类型选择结构初始化 + 全量数据初始化。
2. 主库 A 故障或需要维护时,根据 A 的状态执行灾备切换与重建:
A 可恢复时,切换至 B 后搭建 B→A 反向同步并切回 A。
A 不可恢复时,切换至 B 后创建 B→C 新灾备。
详细操作步骤
步骤一:创建灾备同步任务(A→B)
说明:
1. 登录 DTS 控制台,在左侧导航栏选择数据同步。
2. 单击新建同步任务,在新建同步任务页面,选择同步的源实例类型和所属地域,目标实例类型和所属地域,规格等,然后单击立即购买。
3. 购买完成后,返回数据同步列表,单击操作列的配置,进入配置同步任务页面。
4. 在设置同步源和目标数据库页签,配置任务信息、源库和目标库连接参数,然后单击测试连通性。测试通过后,单击下一步。
源端选择主库 A。
目标端选择灾备库 B。
5. 在设置同步选项和同步对象页签,配置数据初始化选项、数据同步选项和同步对象,设置完成后单击保存并下一步。
初始化类型选择结构初始化 + 全量数据初始化。
主键冲突处理选择冲突覆盖。
同步对象选择整个实例或指定对象。
注意:
主键冲突处理推荐选择冲突覆盖:该策略将 INSERT 改写为
REPLACE INTO,UPDATE 改写为 DELETE + REPLACE INTO,确保灾备库始终以主库数据为准。冲突忽略策略仅对 INSERT 冲突生效,UPDATE 冲突时任务仍会报错,不适合灾备场景。
如果源端有 CREATE TABLE 或 RENAME TABLE 操作,同步对象需勾选该表所在的整个库,否则新建/重命名的表不会同步到目标端。
6. (可选)在数据加工页签,可按需配置 DDL/DML 过滤规则和 Where 条件过滤。灾备场景通常保持默认(全量同步所有 DML 和 DDL)。
7. 在设置一致性校验页面,勾选开启数据一致性校验,配置参数后,单击下一步。
8. 在校验任务页面,完成校验并全部校验项通过后,单击立即启动。任务启动后进入持续同步状态。
步骤二:灾备切换与重建
确认主库 A 需要切换(计划内维护、故障等)时,根据主库 A 的状态选择对应方案。
场景一:主库 A 可恢复
适用于灾备演练、计划内维护、临时故障等主库 A 仍可访问且后续可恢复的场景。
1. 切换至灾备库 B
1.1 登录 DTS 控制台,确认灾备同步任务(A→B)的同步步骤显示为同步中,目标与源库数据差距为 0 KB,时间延迟为 0 秒。
1.2 暂停主库 A 的业务,停止新的数据写入。
1.3 在同步任务操作列选择更多 > 结束,结束 A→B 同步任务。
1.4 验证源库和目标库的数据一致后,将业务系统的数据库连接地址指向灾备库 B,恢复业务使用。
2. 创建反向同步任务(B→A)
1. 在 DTS 控制台左侧导航栏选择数据同步。
2. 单击新建同步任务,在新建同步任务页面,选择同步的源实例类型和所属地域,目标实例类型和所属地域,规格等,然后单击立即购买。
3. 在设置同步源和目标数据库页签,填写源和目标数据库连接信息,然后单击测试连通性,测试通过后单击下一步。
源端选择灾备库 B(当前主库)。
目标端选择原主库 A。
4. 在设置同步选项和同步对象页签,对数据初始化选项、数据同步选项、同步对象选项进行设置,在设置完成后单击保存并下一步。
初始化类型选择不选择。
5. (可选)在数据加工页签,可按需配置 DDL/DML 过滤规则和 Where 条件过滤。
6. 在设置一致性校验页面,勾选开启数据一致性校验,配置参数后,单击下一步。
7. 在校验任务页面,完成校验并全部校验项通过后,单击立即启动。
3. 切回原主库 A
1. 登录 DTS 控制台,确认反向同步任务(B→A)的同步步骤显示为同步中,目标与源库数据差距为 0 KB,时间延迟为 0 秒。
2. 暂停灾备库 B 的业务,停止新的数据写入。
3. 在同步任务操作列选择更多 > 结束,结束 B→A 同步任务。
4. 验证源库和目标库的数据一致后,将业务系统的数据库连接地址指向原主库 A,恢复业务使用。
场景二:主库 A 不可恢复
适用于可用区级故障、数据严重损坏等主库 A 完全不可用的场景。
1. 切换至灾备库 B
1. 登录 DTS 控制台,以灾备库 B 当前已同步的数据为准执行切换。
2. 在同步任务操作列选择更多 > 结束,结束 A→B 同步任务。
3. 将业务系统的数据库连接地址指向灾备库 B,恢复业务使用。
2. 创建灾备同步任务(B→C)
1. 在 DTS 控制台左侧导航栏选择数据同步。
2. 单击新建同步任务,在新建同步任务页面,选择同步的源实例类型和所属地域,目标实例类型和所属地域,规格等,然后单击立即购买。
3. 在设置同步源和目标数据库页签,填写源和目标数据库连接信息,然后单击测试连通性,测试通过后单击下一步。
源端选择新主库 B。
目标端选择新灾备库 C。
4. 在设置同步选项和同步对象页签,对数据初始化选项、数据同步选项、同步对象选项进行设置,在设置完成后单击保存并下一步。
初始化类型选择结构初始化 + 全量数据初始化。
同步对象选择范围与步骤一保持一致。
5. (可选)在数据加工页签,可按需配置 DDL/DML 过滤规则和 Where 条件过滤。
6. 在设置一致性校验页面,勾选开启数据一致性校验,配置参数后,单击下一步。
7. 在校验任务页面,完成校验并全部校验项通过后,单击立即启动。任务启动后进入持续同步状态。
常见问题
Q:MySQL 是否支持两端同时写入(异地多活)?
DTS MySQL 同步链路支持双向同步且内置破环机制,可以两端同时写入。但灾备场景中,强烈建议任何时刻仅一端写入,以避免数据冲突和不一致。如果业务确实需要异地多活,请参考 DTS 双向同步功能的使用限制,确保双写数据不冲突。
Q:灾备库 B 的实例规格如何选择?
建议灾备库 B 的实例规格与主库 A 保持一致或略高。灾备切换后 B 将直接承接生产负载,如果规格不足可能导致切换后性能不达预期。建议在日常运维中定期对灾备库进行性能验证。
Q:灾备切换后,原主库 A 的数据如何处理?
如果原主库 A 可恢复,通过反向同步任务(B→A)将 B 上的增量数据同步回 A,数据追平后可切回。
如果原主库 A 不可恢复,可在 A 修复后作为新的灾备库,从 B 重新同步数据。
无论哪种场景,都建议保留原主库 A 的数据,以便后续比对和恢复。
Q:反向同步为什么不选择全量初始化?
在灾备切换场景中,切换前的步骤已确保 A 和 B 数据完全一致(同步延迟为 0 时才切换)。因此反向同步只需要同步 B 上新产生的增量数据即可,无需重新全量初始化。选择全量初始化反而会增加不必要的时间消耗和资源占用。
相关文档
文档 | 说明 |
MySQL 同步任务的详细配置步骤和参数说明。 | |
DTS 任务创建前的网络打通、账号准备等前置工作指导。 | |
双向同步链路的构建方法和限制条件。 | |
冲突报错、冲突忽略、冲突覆盖三种策略的适用场景。 | |
数据迁移/同步完成后的割接步骤和注意事项。 | |
同步任务的监控指标说明和告警配置参考。 |