如何实现两台Oracle数据库单表双向实时同步及故障后补同步?
针对你这个单表双向实时同步+离线后追补DML操作的核心需求,结合Oracle 12c的特性,我推荐几个经过生产环境验证的方案,你可以根据团队的运维经验和现有架构选择:
方案一:Oracle GoldenGate(OGG)—— 最推荐的轻量灵活方案
OGG是Oracle官方主打的数据同步工具,完美支持同构数据库的双向实时同步,且能自动处理离线后的日志追补,非常适合你这种单表同步的场景。
核心配置要点:
- 基础准备:确保DB1和DB2都开启归档模式(
ALTER DATABASE ARCHIVELOG;),并启用补充日志(ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;),这是OGG捕获DML日志的前提。 - 双向同步配置:
- 在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;
- 在DB1上配置
- 冲突处理:因为是双向同步,必须配置冲突解决规则,比如在Replicat参数中添加:
HANDLECOLLISIONS # 或者自定义规则,比如优先保留最后修改时间晚的记录 RESOLVECOLLISION UPDATE, DELETE, INSERT COMPARECOLS (LAST_UPDATE_TIME) RESOLVEUPDATE (MAX(LAST_UPDATE_TIME)) - 离线恢复:当其中一方数据库离线时,OGG会自动保留未发送/未应用的日志,恢复后会自动读取离线期间的归档日志,完成所有DML操作的追补,无需手动干预。
优势:
- 轻量,仅同步目标表,资源占用低
- 实时性高,延迟通常在秒级
- 故障恢复自动化,无需手动处理离线期间的日志
方案二:Oracle Streams(适合熟悉Streams运维的团队)
Streams是Oracle早期的日志同步技术,12c仍支持,同样能实现双向单表同步,原理是基于日志挖掘捕获DML,通过传播进程发送到目标库,再由应用进程执行。
核心配置要点:
- 启用Streams:在DB1和DB2上都启用Streams配置(
EXEC DBMS_STREAMS_ADM.SET_UP_STREAMS();)。 - 创建捕获与传播进程:
- 在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。
- 在DB1上创建捕获进程,仅捕获目标表的DML:
- 冲突解决:通过
DBMS_APPLY_ADM.SET_CONFLICT_HANDLER()配置冲突规则,比如基于时间戳的冲突解决。 - 离线恢复: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灵活
关键注意事项
- 冲突处理是核心:双向同步必须明确冲突解决策略,否则会出现数据覆盖的问题,推荐用最后修改时间戳或版本号作为冲突判断依据。
- 归档模式必须开启:不管用哪个方案,都需要数据库开启归档模式,否则无法追补离线期间的DML操作。
- 数据一致性校验:定期用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
相关产品推荐
相关产品推荐

