Oracle GoldenGate 冲突处理详解
Oracle GoldenGate 冲突处理详解
适用版本:Oracle GoldenGate 12c / 19c / 21c 文档版本:v1.0 / 2026-07
1. 概述
冲突处理保证 Active-Active 复制数据一致性[1]:
详细见:Oracle GoldenGate 全集。
2. 冲突类型
2.1 UPDATE
- 同一行两端同时更新
- 数据不一致
2.2 INSERT
- 主键冲突
- 重复插入
2.3 DELETE
- 一端删除
- 另一端找不到
3. 解决策略
3.1 IGNORE
- 忽略错误
- 继续复制
3.2 OVERWRITE
- 覆盖目标
- 源端优先
3.3 DISCARD
- 丢弃
- 记录到 discard 文件
3.4 RETRY
- 重试
- 延迟
4. CDR(Conflict Detection and Resolution)
4.1 配置
# rep1.prm
MAP scott.emp, TARGET scott.emp,
RESOLVECONFLICT (UPSERTEXISTING,
USEMIN (sal, COLS (sal)),
USEMAX (updated_at, COLS (updated_at)));
4.2 模式
- UPSERTEXISTING:更新不存在则插入
- UPDATEROWEXISTS:行存在时更新
- INSERTROWEXISTS:插入时已存在
- DELETEROWEXISTS:删除时存在
- DELETEROWMISSING:删除时不存在
- UPDATEROWMISSING:更新时不存在
4.3 解决方法
- USEMAX:取最大值
- USEMIN:取最小值
- USEMAXEQ:最大值(含等于)
- USEMINEQ:最小值(含等于)
- OVERWRITE:覆盖
- DISCARD:丢弃
- IGNORE:忽略
5. BEFORE 子句
5.1 比较
MAP scott.emp, TARGET scott.emp,
COMPARECOLS (ON UPDATE: sal, ON DELETE: sal),
RESOLVECONFLICT (UPDATEROWEXISTS,
USEMAX (sal, COLS (sal)));
5.2 逻辑
- 比较源端 before 值与目标当前值
- 不一致:冲突
- 触发解决
6. SQLEXEC
6.1 调用过程
MAP scott.emp, TARGET scott.emp,
SQLEXEC (sp_resolve_conflict,
PARAMS (p_id = id, p_sal = sal)),
RESOLVECONFLICT (...);
6.2 自定义逻辑
- 复杂冲突解决
- 业务规则
- 存储过程
7. 时间戳
7.1 配置
MAP scott.emp, TARGET scott.emp,
RESOLVECONFLICT (UPDATEROWEXISTS,
USEMAX (updated_at, COLS (updated_at)));
7.2 逻辑
- 较新时间戳胜出
- 需要时间戳列
- 全表统一
8. 丢弃文件
8.1 配置
# rep1.prm
DISCARDFILE ./dirrpt/rep1.dsc, APPEND, MEGABYTES 10
DISCARDROLLOVER AT 2:00
REPERROR (DEFAULT, DISCARD)
8.2 分析
- 查看 .dsc 文件
- 错误类型
- 数据
9. 异常表
9.1 创建
CREATE TABLE exception_log (
rep_name VARCHAR2(10),
table_name VARCHAR2(100),
errno NUMBER,
errmsg VARCHAR2(4000),
optype VARCHAR2(20),
errtype VARCHAR2(20),
logrba NUMBER,
logposition NUMBER,
committimestamp TIMESTAMP,
data VARCHAR2(4000)
);
9.2 配置
# rep1.prm
REPERROR (DEFAULT, EXCEPTION)
EXCEPTIONTABLE scott.exception_log
10. Active-Active
10.1 双向复制
Site A → Site B
Site B → Site A
10.2 Loop Prevention
# A → B
EXTRACT ext1
TABLE scott.*, TOKENS (origin = 'A');
# B → A
REPLICAT rep1
MAP scott.*, TARGET scott.*, FILTER (@TOKEN('origin') != 'A');
11. 监控
11.1 Replicat 状态
> STATS REPLICAT rep1
> INFO REPLICAT rep1, DETAIL
11.2 异常表
SELECT * FROM exception_log
WHERE committimestamp > SYSDATE - 1
ORDER BY committimestamp DESC;
11.3 Discard 文件
cat ./dirrpt/rep1.dsc | tail -100
12. 常见冲突场景
12.1 INSERT-INSERT
- 两端同时插入相同主键
- USEMAX/USEMIN
- 时间戳
12.2 UPDATE-UPDATE
- 两端同时更新同一行
- USEMAX(updated_at)
12.3 DELETE-UPDATE
- 一端删除
- 另一端更新
- DELETEROWMISSING
13. 应用场景
13.1 Active-Active
- 多地写入
- 双向复制
- 冲突解决
13.2 数据同步
- 多系统同步
- 冲突检测
- 异常处理
13.3 数据集成
- 多源汇聚
- 主键冲突
- 解决
14. 常见坑与排错
14.1 数据不一致
- 冲突未解决
- 检查 discard
- 手动修复
14.2 性能
- CDR 开销
- 监控
14.3 循环
- Loop prevention
- TOKEN
- FILTER
15. 最佳实践
- 时间戳列:必须
- CDR 配置:明确
- Discard:记录
- Exception 表:详细
- Loop prevention:双向
- 监控:异常
- 测试:冲突场景
- 业务规则:明确
- 文档:解决策略
- 演练:定期
16. 参考资料
[1] Oracle GoldenGate Windows and Unix 19c, “Conflict Detection and Resolution” https://docs.oracle.com/en/middleware/goldengate/core/19.1/