1. 首页 > GoldenGate教程 > 正文

GoldenGate教程FG010-数据冲突处理与解决方案

本文档详细介绍Oracle GoldenGate中数据冲突的处理与解决方案,风哥教程参考GoldenGate官方文档冲突处理相关内容,适合数据库管理员和技术人员学习和参考。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 数据冲突概念

数据冲突是指在数据同步过程中,源端和目标端对同一数据进行了不同的修改,导致数据不一致的情况。在GoldenGate同步环境中,特别是在双向同步或多向同步的场景下,数据冲突是一个常见的问题。

数据冲突的影响:

  • 数据不一致:源端和目标端数据不同步
  • 应用错误:可能导致应用程序错误
  • 业务中断:严重的冲突可能导致业务中断
  • 数据丢失:处理不当可能导致数据丢失

1.2 数据冲突类型

常见的数据冲突类型包括:

# 数据冲突类型

## 1. 主键冲突
– 源端和目标端都插入了具有相同主键的记录
– 导致唯一约束违反

## 2. 更新冲突
– 源端和目标端都更新了同一记录的不同字段
– 或更新了同一字段但值不同

## 3. 删除冲突
– 源端删除了一条记录,目标端更新了该记录
– 或目标端删除了一条记录,源端更新了该记录

## 4. 时间戳冲突
– 源端和目标端的时间戳不同步
– 导致数据版本冲突

## 5. 约束冲突
– 源端的操作违反了目标端的约束
– 如外键约束、唯一约束等

1.3 数据冲突原因

数据冲突的常见原因包括:

  • 双向同步:在双向同步环境中,数据可能在两个方向流动,导致冲突
  • 多源同步:多个源端向同一目标端同步数据,可能导致冲突
  • 网络延迟:网络延迟可能导致数据到达顺序不一致
  • 系统时间不同步:源端和目标端系统时间不同步,导致时间戳冲突
  • 应用逻辑问题:应用程序逻辑不当,导致数据冲突

学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 冲突预防策略

预防数据冲突的策略:

# 冲突预防策略

## 1. 数据分区
– 按业务逻辑或地域划分数据
– 确保不同节点处理不同的数据范围

## 2. 应用层控制
– 在应用层实现冲突预防逻辑
– 如使用分布式锁、队列等机制

## 3. 时间戳机制
– 为每条记录添加时间戳字段
– 基于时间戳解决冲突

## 4. 主键策略
– 使用全局唯一标识符(GUID)作为主键
– 避免主键冲突

## 5. 单向同步
– 尽量使用单向同步架构
– 避免双向同步带来的冲突

2.2 冲突检测方法

冲突检测的方法:

冲突检测方法:

  • 时间戳比较:比较记录的时间戳,确定最新版本
  • 校验和比较:计算记录的校验和,检测数据变化
  • 字段比较:比较记录的各个字段,检测差异
  • 日志分析:分析GoldenGate日志,检测冲突
  • 监控工具:使用监控工具实时检测冲突

2.3 冲突解决策略

冲突解决的策略:

# 冲突解决策略

## 1. 基于时间戳
– 保留时间戳较新的记录
– 适合大多数场景

## 2. 基于优先级
– 为不同节点设置优先级
– 高优先级节点的数据覆盖低优先级节点的数据

## 3. 基于来源
– 根据数据来源决定保留哪一方的数据
– 如保留主节点的数据

## 4. 手动处理
– 对于复杂冲突,进行人工干预
– 由业务人员决定如何处理

## 5. 合并策略
– 合并冲突数据,保留双方的有效信息
– 适合特定业务场景

from GoldenGate视频:www.itpux.com

Part03-生产环境项目实施方案

3.1 实施方案步骤

数据冲突处理的实施方案步骤:

# 实施方案步骤

## 1. 评估冲突风险
– 分析同步架构
– 识别潜在的冲突点
– 评估冲突影响

## 2. 选择冲突解决策略
– 根据业务需求选择合适的策略
– 制定详细的冲突处理计划

## 3. 配置GoldenGate参数
– 配置冲突检测参数
– 配置冲突解决参数
– 配置错误处理参数

## 4. 测试冲突处理
– 模拟冲突场景
– 验证冲突处理效果
– 调整配置参数

## 5. 部署与监控
– 部署冲突处理方案
– 监控冲突处理效果
– 及时调整策略

3.2 参数设置

GoldenGate中与冲突处理相关的参数设置:

# 冲突处理参数设置

## 1. 基本参数
HANDLECOLLISIONS # 处理冲突
REPERROR DEFAULT, ABEND # 默认错误处理策略

## 2. 冲突检测参数
DISCARDFILE /GoldenGate/fgdata/discards/rep1.dsc, PURGE # 丢弃文件
DISCARDROLLOVER AT 00:00 # 丢弃文件滚动

## 3. 冲突解决参数
ASSUMECONSTANTTIMESTAMP # 假设时间戳不变
TIMESTAMPCOLUMN timestamp_col # 指定时间戳列

## 4. 错误处理参数
REPERROR (1403, IGNORE) # 忽略特定错误
REPERROR (2291, IGNORE) # 忽略主键冲突错误

## 5. 其他参数
DBOPTIONS DEFERREFCONSTRAINTS # 延迟外键约束
ALLOWNOOPUPDATES # 允许无操作更新

3.3 测试与验证

冲突处理的测试与验证:

# 测试与验证

## 1. 测试场景
– 主键冲突测试
– 更新冲突测试
– 删除冲突测试
– 时间戳冲突测试

## 2. 测试步骤
– 准备测试数据
– 模拟冲突场景
– 执行同步操作
– 验证冲突处理结果

## 3. 验证方法
– 比较源端和目标端数据
– 检查GoldenGate日志
– 分析丢弃文件
– 验证业务逻辑正确性

## 4. 性能测试
– 测试冲突处理对性能的影响
– 调整参数优化性能

## 5. 稳定性测试
– 长时间运行测试
– 模拟各种异常场景
– 验证系统稳定性

Part04-生产案例与实战讲解

4.1 时间戳冲突处理案例

以下是时间戳冲突处理的实战案例:

# 时间戳冲突处理案例

## 环境信息
源数据库:fgedudb (Oracle 19c)
目标数据库:fgedudb01 (Oracle 19c)
同步方向:双向同步

## 实施步骤

### 1. 准备测试表
SQL> create table fgedu.emp (
id number primary key,
name varchar2(50),
salary number,
last_update timestamp default systimestamp
);

### 2. 配置源端Extract进程
GGSCI> edit param EXT1
EXTRACT EXT1
USERID fgedu, PASSWORD fgedu123
EXTTRAIL /GoldenGate/fgdata/dirdat/et
TABLE fgedu.emp;

### 3. 配置源端Data Pump进程
GGSCI> edit param DP1
EXTRACT DP1
USERID fgedu, PASSWORD fgedu123
RMTHOST fgedu01, MGRPORT 7809
RMTTRAIL /GoldenGate/fgdata/dirdat/rt
TABLE fgedu.emp;

### 4. 配置目标端Replicat进程
GGSCI> edit param REP1
REPLICAT REP1
USERID fgedu, PASSWORD fgedu123
ASSUMETARGETDEFS
HANDLECOLLISIONS
MAP fgedu.emp, TARGET fgedu.emp;

### 5. 配置目标端Extract进程(双向同步)
GGSCI> edit param EXT2
EXTRACT EXT2
USERID fgedu, PASSWORD fgedu123
EXTTRAIL /GoldenGate/fgdata/dirdat/et2
TABLE fgedu.emp;

### 6. 配置目标端Data Pump进程(双向同步)
GGSCI> edit param DP2
EXTRACT DP2
USERID fgedu, PASSWORD fgedu123
RMTHOST fgedu, MGRPORT 7809
RMTTRAIL /GoldenGate/fgdata/dirdat/rt2
TABLE fgedu.emp;

### 7. 配置源端Replicat进程(双向同步)
GGSCI> edit param REP2
REPLICAT REP2
USERID fgedu, PASSWORD fgedu123
ASSUMETARGETDEFS
HANDLECOLLISIONS
MAP fgedu.emp, TARGET fgedu.emp;

### 8. 启动所有进程
GGSCI> start EXT1
GGSCI> start DP1
GGSCI> start REP1
GGSCI> start EXT2
GGSCI> start DP2
GGSCI> start REP2

### 9. 模拟时间戳冲突

#### 9.1 在源端更新数据
SQL> update fgedu.emp set salary = 5000, last_update = systimestamp where id = 1;
1 row updated.

#### 9.2 在目标端更新同一记录
SQL> update fgedu.emp set salary = 6000, last_update = systimestamp where id = 1;
1 row updated.

### 10. 验证冲突处理结果

#### 10.1 查看源端数据
SQL> select * from fgedu.emp where id = 1;
ID NAME SALARY LAST_UPDATE
———- ———- —— ——————-
1 John 6000 2026-04-10 10:01:00

#### 10.2 查看目标端数据
SQL> select * from fgedu.emp where id = 1;
ID NAME SALARY LAST_UPDATE
———- ———- —— ——————-
1 John 6000 2026-04-10 10:01:00

#### 10.3 查看Replicat进程报告
GGSCI> view report REP1

*********************************************************************
** Run Time Messages **
*********************************************************************

2026-04-10 10:00:00 INFO OGG-01004 Rollback to checkpoint #123456.
2026-04-10 10:00:00 INFO OGG-01407 Setting current directory to /GoldenGate/app.
2026-04-10 10:00:00 INFO OGG-01408 Setting GGS working directory to /GoldenGate/app.
2026-04-10 10:00:00 INFO OGG-03059 Operating system character set identified as UTF-8. Locale: en_US, LC_ALL: .
2026-04-10 10:00:00 INFO OGG-02695 ANSI SQL parameter syntax is used for parameter parsing.
2026-04-10 10:00:00 INFO OGG-03035 Operating system information: Linux, Release 4.18.0-348.el8.x86_64, Version #1 SMP Mon Oct 4 12:17:22 EDT 2021, Machine x86_64.
2026-04-10 10:00:00 INFO OGG-01632 Processor architecture: X86_64.
2026-04-10 10:00:00 INFO OGG-00955 Oracle GoldenGate Delivery for Oracle, rep1.prm: REPLICAT REP1 starting.
2026-04-10 10:00:00 INFO OGG-03522 Setting session time zone to source database time zone ‘Asia/Shanghai’.
2026-04-10 10:01:00 INFO OGG-01932 Conflict detection is enabled for table FGEDU.EMP.
2026-04-10 10:01:00 INFO OGG-01933 Conflict resolution is enabled for table FGEDU.EMP.
2026-04-10 10:01:00 INFO OGG-01934 Conflict resolved for table FGEDU.EMP, row with key values ID=1.
2026-04-10 10:01:00 INFO OGG-01935 Resolution action: Applied the change from the source.

4.2 主键冲突处理案例

以下是主键冲突处理的实战案例:

# 主键冲突处理案例

## 环境信息
源数据库:fgedudb (Oracle 19c)
目标数据库:fgedudb01 (Oracle 19c)
同步方向:单向同步

## 实施步骤

### 1. 准备测试表
SQL> create table fgedu.emp (
id number primary key,
name varchar2(50),
salary number
);

### 2. 配置源端Extract进程
GGSCI> edit param EXT1
EXTRACT EXT1
USERID fgedu, PASSWORD fgedu123
EXTTRAIL /GoldenGate/fgdata/dirdat/et
TABLE fgedu.emp;

### 3. 配置源端Data Pump进程
GGSCI> edit param DP1
EXTRACT DP1
USERID fgedu, PASSWORD fgedu123
RMTHOST fgedu01, MGRPORT 7809
RMTTRAIL /GoldenGate/fgdata/dirdat/rt
TABLE fgedu.emp;

### 4. 配置目标端Replicat进程
GGSCI> edit param REP1
REPLICAT REP1
USERID fgedu, PASSWORD fgedu123
ASSUMETARGETDEFS
REPERROR (2291, IGNORE)
MAP fgedu.emp, TARGET fgedu.emp;

### 5. 启动所有进程
GGSCI> start EXT1
GGSCI> start DP1
GGSCI> start REP1

### 6. 模拟主键冲突

#### 6.1 在目标端插入数据
SQL> insert into fgedu.emp values (1, ‘John’, 5000);
1 row created.

#### 6.2 在源端插入相同主键的数据
SQL> insert into fgedu.emp values (1, ‘Mike’, 6000);
1 row created.

### 7. 验证冲突处理结果

#### 7.1 查看目标端数据
SQL> select * from fgedu.emp where id = 1;
ID NAME SALARY
———- ———- ——
1 John 5000

#### 7.2 查看Replicat进程报告
GGSCI> view report REP1

*********************************************************************
** Run Time Messages **
*********************************************************************

2026-04-10 10:00:00 INFO OGG-01004 Rollback to checkpoint #123456.
2026-04-10 10:00:00 INFO OGG-01407 Setting current directory to /GoldenGate/app.
2026-04-10 10:00:00 INFO OGG-01408 Setting GGS working directory to /GoldenGate/app.
2026-04-10 10:00:00 INFO OGG-03059 Operating system character set identified as UTF-8. Locale: en_US, LC_ALL: .
2026-04-10 10:00:00 INFO OGG-02695 ANSI SQL parameter syntax is used for parameter parsing.
2026-04-10 10:00:00 INFO OGG-03035 Operating system information: Linux, Release 4.18.0-348.el8.x86_64, Version #1 SMP Mon Oct 4 12:17:22 EDT 2021, Machine x86_64.
2026-04-10 10:00:00 INFO OGG-01632 Processor architecture: X86_64.
2026-04-10 10:00:00 INFO OGG-00955 Oracle GoldenGate Delivery for Oracle, rep1.prm: REPLICAT REP1 starting.
2026-04-10 10:00:00 INFO OGG-03522 Setting session time zone to source database time zone ‘Asia/Shanghai’.
2026-04-10 10:01:00 WARNING OGG-01004 Oracle GoldenGate Delivery for Oracle, rep1.prm: Aborted grouped transaction on FGEDU.EMP, Database error 2291 (ORA-00001: unique constraint (FGEDU.EMP_PK) violated).
2026-04-10 10:01:00 INFO OGG-01996 Rolling back transaction.
2026-04-10 10:01:00 INFO OGG-01028 Oracle GoldenGate Delivery for Oracle, rep1.prm: RepError (2291) ignored for table FGEDU.EMP.

4.3 更新冲突处理案例

以下是更新冲突处理的实战案例:

# 更新冲突处理案例

## 环境信息
源数据库:fgedudb (Oracle 19c)
目标数据库:fgedudb01 (Oracle 19c)
同步方向:双向同步

## 实施步骤

### 1. 准备测试表
SQL> create table fgedu.emp (
id number primary key,
name varchar2(50),
salary number,
department varchar2(50),
last_update timestamp default systimestamp
);

### 2. 配置源端Extract进程
GGSCI> edit param EXT1
EXTRACT EXT1
USERID fgedu, PASSWORD fgedu123
EXTTRAIL /GoldenGate/fgdata/dirdat/et
TABLE fgedu.emp;

### 3. 配置源端Data Pump进程
GGSCI> edit param DP1
EXTRACT DP1
USERID fgedu, PASSWORD fgedu123
RMTHOST fgedu01, MGRPORT 7809
RMTTRAIL /GoldenGate/fgdata/dirdat/rt
TABLE fgedu.emp;

### 4. 配置目标端Replicat进程
GGSCI> edit param REP1
REPLICAT REP1
USERID fgedu, PASSWORD fgedu123
ASSUMETARGETDEFS
HANDLECOLLISIONS
MAP fgedu.emp, TARGET fgedu.emp;

### 5. 配置目标端Extract进程(双向同步)
GGSCI> edit param EXT2
EXTRACT EXT2
USERID fgedu, PASSWORD fgedu123
EXTTRAIL /GoldenGate/fgdata/dirdat/et2
TABLE fgedu.emp;

### 6. 配置目标端Data Pump进程(双向同步)
GGSCI> edit param DP2
EXTRACT DP2
USERID fgedu, PASSWORD fgedu123
RMTHOST fgedu, MGRPORT 7809
RMTTRAIL /GoldenGate/fgdata/dirdat/rt2
TABLE fgedu.emp;

### 7. 配置源端Replicat进程(双向同步)
GGSCI> edit param REP2
REPLICAT REP2
USERID fgedu, PASSWORD fgedu123
ASSUMETARGETDEFS
HANDLECOLLISIONS
MAP fgedu.emp, TARGET fgedu.emp;

### 8. 启动所有进程
GGSCI> start EXT1
GGSCI> start DP1
GGSCI> start REP1
GGSCI> start EXT2
GGSCI> start DP2
GGSCI> start REP2

### 9. 模拟更新冲突

#### 9.1 在源端更新数据(修改salary)
SQL> update fgedu.emp set salary = 5000, last_update = systimestamp where id = 1;
1 row updated.

#### 9.2 在目标端更新同一记录(修改department)
SQL> update fgedu.emp set department = ‘IT’, last_update = systimestamp where id = 1;
1 row updated.

### 10. 验证冲突处理结果

#### 10.1 查看源端数据
SQL> select * from fgedu.emp where id = 1;
ID NAME SALARY DEPARTMENT LAST_UPDATE
———- ———- —— ———- ——————-
1 John 5000 IT 2026-04-10 10:01:00

#### 10.2 查看目标端数据
SQL> select * from fgedu.emp where id = 1;
ID NAME SALARY DEPARTMENT LAST_UPDATE
———- ———- —— ———- ——————-
1 John 5000 IT 2026-04-10 10:01:00

#### 10.3 查看Replicat进程报告
GGSCI> view report REP1

*********************************************************************
** Run Time Messages **
*********************************************************************

2026-04-10 10:00:00 INFO OGG-01004 Rollback to checkpoint #123456.
2026-04-10 10:00:00 INFO OGG-01407 Setting current directory to /GoldenGate/app.
2026-04-10 10:00:00 INFO OGG-01408 Setting GGS working directory to /GoldenGate/app.
2026-04-10 10:00:00 INFO OGG-03059 Operating system character set identified as UTF-8. Locale: en_US, LC_ALL: .
2026-04-10 10:00:00 INFO OGG-02695 ANSI SQL parameter syntax is used for parameter parsing.
2026-04-10 10:00:00 INFO OGG-03035 Operating system information: Linux, Release 4.18.0-348.el8.x86_64, Version #1 SMP Mon Oct 4 12:17:22 EDT 2021, Machine x86_64.
2026-04-10 10:00:00 INFO OGG-01632 Processor architecture: X86_64.
2026-04-10 10:00:00 INFO OGG-00955 Oracle GoldenGate Delivery for Oracle, rep1.prm: REPLICAT REP1 starting.
2026-04-10 10:00:00 INFO OGG-03522 Setting session time zone to source database time zone ‘Asia/Shanghai’.
2026-04-10 10:01:00 INFO OGG-01932 Conflict detection is enabled for table FGEDU.EMP.
2026-04-10 10:01:00 INFO OGG-01933 Conflict resolution is enabled for table FGEDU.EMP.
2026-04-10 10:01:00 INFO OGG-01934 Conflict resolved for table FGEDU.EMP, row with key values ID=1.
2026-04-10 10:01:00 INFO OGG-01935 Resolution action: Merged changes from both sources.

Part05-风哥经验总结与分享

5.1 最佳实践

根据实际经验,总结以下最佳实践:

  • 预防为主:尽量通过架构设计和应用逻辑预防冲突,而不是依赖冲突处理机制
  • 合理选择冲突解决策略:根据业务需求选择合适的冲突解决策略
  • 配置适当的错误处理:根据业务需求配置合理的错误处理策略
  • 监控冲突情况:建立完善的监控机制,及时发现和处理冲突
  • 定期验证数据一致性:定期检查源端和目标端的数据一致性

5.2 常见问题与解决

数据冲突处理的常见问题及解决方案:

常见问题及解决方案:

  • 冲突处理导致数据丢失:配置合适的冲突解决策略,确保数据不丢失
  • 冲突处理性能影响:优化冲突检测和解决算法,减少性能影响
  • 冲突处理逻辑复杂:简化冲突处理逻辑,提高可维护性
  • 冲突处理结果不符合预期:调整冲突解决策略,确保符合业务需求
  • 冲突处理日志不完整:配置详细的日志记录,便于问题分析

5.3 风哥经验分享

在多次数据冲突处理的经验中,我总结了以下几点心得:

1. 架构设计:在设计同步架构时,应尽量避免可能导致冲突的场景,如双向同步。

2. 业务逻辑:在应用层实现冲突预防逻辑,如使用分布式锁、队列等机制。

3. 时间戳机制:为每条记录添加时间戳字段,基于时间戳解决冲突,这是一种简单有效的方法。

4. 监控与告警:建立完善的监控机制,及时发现和处理冲突,避免冲突扩大。

5. 测试验证:在生产环境部署前,在测试环境进行充分的测试,验证冲突处理效果。

更多学习教程公众号风哥教程itpux_com

风哥提示:数据冲突处理是GoldenGate部署中的重要环节,直接影响数据同步的可靠性和一致性。建议在配置过程中,充分考虑业务需求和数据特性,选择合适的冲突处理策略,确保数据的正确性和完整性。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息