You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现两台Oracle数据库单表双向实时同步及故障后补同步?

针对你这个单表双向实时同步+离线后追补DML操作的核心需求,结合Oracle 12c的特性,我推荐几个经过生产环境验证的方案,你可以根据团队的运维经验和现有架构选择:

方案一:Oracle GoldenGate(OGG)—— 最推荐的轻量灵活方案

OGG是Oracle官方主打的数据同步工具,完美支持同构数据库的双向实时同步,且能自动处理离线后的日志追补,非常适合你这种单表同步的场景。

核心配置要点:

  1. 基础准备:确保DB1和DB2都开启归档模式(ALTER DATABASE ARCHIVELOG;),并启用补充日志(ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;),这是OGG捕获DML日志的前提。
  2. 双向同步配置:
    • 在DB1上配置Extract进程捕获目标表的DML操作,Pump进程将日志发送到DB2;同时在DB2上配置对应的Replicat进程将日志应用到DB2的目标表。
    • 反向同理,在DB2上配置Extract捕获本地DML,Pump发送到DB1,DB1上的Replicat应用日志。
    • 关键配置示例(OGG命令行):
      # 在DB1上添加Extract进程
      ADD EXTRACT ext_db1, TRANLOG, BEGIN NOW
      ADD EXTTRAIL ./dirdat/lt, EXTRACT ext_db1
      EDIT PARAMS ext_db1
      # 参数文件里指定要同步的表
      TABLE your_schema.target_table;
      
      # 在DB2上添加Replicat进程
      ADD REPLICAT rep_db2, EXTTRAIL ./dirdat/lt
      EDIT PARAMS rep_db2
      MAP your_schema.target_table, TARGET your_schema.target_table;
      
  3. 冲突处理:因为是双向同步,必须配置冲突解决规则,比如在Replicat参数中添加:
    HANDLECOLLISIONS
    # 或者自定义规则,比如优先保留最后修改时间晚的记录
    RESOLVECOLLISION UPDATE, DELETE, INSERT
    COMPARECOLS (LAST_UPDATE_TIME)
    RESOLVEUPDATE (MAX(LAST_UPDATE_TIME))
    
  4. 离线恢复:当其中一方数据库离线时,OGG会自动保留未发送/未应用的日志,恢复后会自动读取离线期间的归档日志,完成所有DML操作的追补,无需手动干预。

优势:

  • 轻量,仅同步目标表,资源占用低
  • 实时性高,延迟通常在秒级
  • 故障恢复自动化,无需手动处理离线期间的日志

方案二:Oracle Streams(适合熟悉Streams运维的团队)

Streams是Oracle早期的日志同步技术,12c仍支持,同样能实现双向单表同步,原理是基于日志挖掘捕获DML,通过传播进程发送到目标库,再由应用进程执行。

核心配置要点:

  1. 启用Streams:在DB1和DB2上都启用Streams配置(EXEC DBMS_STREAMS_ADM.SET_UP_STREAMS();)。
  2. 创建捕获与传播进程:
    • 在DB1上创建捕获进程,仅捕获目标表的DML:EXEC DBMS_STREAMS_ADM.ADD_TABLE_RULES('your_schema.target_table', 'CAPTURE', 'DB1_CAPTURE');
    • 创建传播进程将捕获的日志发送到DB2:EXEC DBMS_STREAMS_ADM.ADD_PROPAGATION_RULES('your_schema.target_table', 'DB1_TO_DB2_PROPAGATION');
    • 反向在DB2上配置对应的捕获和传播进程到DB1。
  3. 冲突解决:通过DBMS_APPLY_ADM.SET_CONFLICT_HANDLER()配置冲突规则,比如基于时间戳的冲突解决。
  4. 离线恢复:Streams会自动记录未传播的日志,当目标库恢复后,传播进程会自动发送离线期间的日志,应用进程执行追补。

注意:

Oracle官方现在更推荐OGG替代Streams,所以如果团队没有Streams的运维经验,优先选OGG。


方案三:双向Active Data Guard(适合需要整库容灾的场景)

如果你的需求不仅是单表同步,还需要整库的容灾备份,可以考虑配置双向Active Data Guard,但这个方案相对较重,因为默认是整库同步,需要额外配置过滤实现单表同步。

核心思路:

  • 配置DB1和DB2互为Active Data Guard主备库,双方都可读写(需要Active Data Guard许可证)。
  • 通过DBMS_STREAMS_ADM配置规则,仅同步目标表的DML操作,过滤掉其他表的同步。
  • 离线恢复时,Data Guard会自动同步归档日志,完成整库(包括目标表)的追补。

局限性:

  • 需要额外的许可证(Active Data Guard是付费特性)
  • 整库同步会占用更多资源,不如OGG灵活

关键注意事项

  1. 冲突处理是核心:双向同步必须明确冲突解决策略,否则会出现数据覆盖的问题,推荐用最后修改时间戳或版本号作为冲突判断依据。
  2. 归档模式必须开启:不管用哪个方案,都需要数据库开启归档模式,否则无法追补离线期间的DML操作。
  3. 数据一致性校验:定期用Oracle自带的DBMS_COMPARISON包校验两张表的数据一致性,确保同步没有遗漏或错误:
    DECLARE
      comp_result BOOLEAN;
    BEGIN
      comp_result := DBMS_COMPARISON.COMPARE(
        comparison_name => 'TARGET_TABLE_COMP',
        schema_name => 'YOUR_SCHEMA',
        object_name => 'TARGET_TABLE',
        remote_schema_name => 'YOUR_SCHEMA',
        remote_object_name => 'TARGET_TABLE',
        dblink_name => 'DB2_DBLINK'
      );
    END;
    /
    

内容的提问来源于stack exchange,提问作者Pal Chakraborty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:16:43