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