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. 最佳实践

  1. 时间戳列:必须
  2. CDR 配置:明确
  3. Discard:记录
  4. Exception 表:详细
  5. Loop prevention:双向
  6. 监控:异常
  7. 测试:冲突场景
  8. 业务规则:明确
  9. 文档:解决策略
  10. 演练:定期

16. 参考资料

[1] Oracle GoldenGate Windows and Unix 19c, “Conflict Detection and Resolution” https://docs.oracle.com/en/middleware/goldengate/core/19.1/