1. 首页 > GoldenGate教程 > 正文

GoldenGate教程FG067-OGG同步冲突(主键冲突、数据不一致)解决实战

内容简介:
本文详细介绍OGG同步冲突的解决方法,包括主键冲突、数据不一致等常见问题的诊断和解决方案。风哥教程参考GoldenGate官方文档GoldenGate冲突解决指南、GoldenGate数据一致性手册等内容,帮助读者掌握OGG同步冲突的处理技巧。

目录大纲

Part01-基础概念与理论知识
    1.1 OGG同步冲突类型与成因
    1.2 OGG冲突检测机制
    1.3 OGG冲突解决策略
Part02-生产环境规划与建议
    2.1 OGG冲突预防策略规划
    2.2 OGG冲突监控方案设计
    2.3 OGG冲突恢复方案规划
Part03-生产环境项目实施方案
    3.1 OGG主键冲突解决配置
    3.2 OGG数据不一致修复配置
    3.3 OGG冲突日志分析配置
Part04-生产案例与实战讲解
    4.1 OGG主键冲突解决实战案例
    4.2 OGG数据不一致修复实战
    4.3 OGG冲突自动化处理实战
Part05-风哥经验总结与分享
    5.1 OGG冲突解决最佳实践
    5.2 OGG冲突预防经验总结
    5.3 OGG冲突处理工具与脚本

Part01-基础概念与理论知识

1.1 OGG同步冲突类型与成因

OGG同步冲突主要包括主键冲突、数据不一致、更新冲突、删除冲突等多种类型,学习交流加群风哥微信: itpux-com。

常见冲突类型:
1. 主键冲突:插入操作违反主键唯一性约束
2. 数据不一致:源端和目标端数据存在差异
3. 更新冲突:同一记录被多次更新
4. 删除冲突:删除不存在的记录
5. 外键冲突:违反外键约束

# 查看OGG冲突统计
cd /GoldenGate/app
./ggsci

Oracle GoldenGate Command Interpreter for Oracle
Version 23.0.0.0.0
Build 001

GGSCI (fgedu.net.cn) 1>

# 查看Replicat冲突统计
GGSCI (fgedu.net.cn)> STATS REPLICAT R_FGEDU01, TOTAL, REPORTCOUNT

Replicat R_FGEDU01 statistics:

Total operations 1,802,590
Total discards 123
Total conflicts 45

Conflict Types:
Duplicate key errors 23
Missing record errors 12
Constraint violations 8
Other errors 2

1.2 OGG冲突检测机制

OGG通过多种机制检测和记录同步冲突,包括冲突日志、统计信息、告警等。

# 查看冲突日志
GGSCI (fgedu.net.cn)> VIEW REPORT R_FGEDU01

Oracle GoldenGate Replicat for Oracle
Version 23.0.0.0.0

Replicat R_FGEDU01
Started 2024-01-15 08:00:00

Conflict Summary:

Table: fgedu01.fgedu_orders
Conflict: Duplicate key on insert
Timestamp: 2024-01-15 10:30:15
Operation: INSERT
Primary Key: order_id = 1001234
Error: ORA-00001: unique constraint violated

Table: fgedu01.fgedu_products
Conflict: Record not found on update
Timestamp: 2024-01-15 10:31:20
Operation: UPDATE
Primary Key: product_id = 5006789
Error: ORA-02291: integrity constraint violated

# 查看Discard文件
cat /GoldenGate/app/dirrpt/R_FGEDU01.dsc

*** Discard file for Replicat R_FGEDU01 ***
Generated: 2024-01-15 10:30:15

*** Operation at 2024-01-15 10:30:15 ***
Table: fgedu01.fgedu_orders
Operation: INSERT
Primary Key: order_id = 1001234
Error: ORA-00001: unique constraint violated

*** Operation at 2024-01-15 10:31:20 ***
Table: fgedu01.fgedu_products
Operation: UPDATE
Primary Key: product_id = 5006789
Error: ORA-02291: integrity constraint violated

1.3 OGG冲突解决策略

OGG提供多种冲突解决策略,包括忽略、覆盖、合并、自定义处理等。

冲突解决策略:
1. IGNORE:忽略冲突操作
2. OVERWRITE:用源端数据覆盖目标端
3. USELATEST:使用最新的时间戳
4. DISCARD:丢弃冲突操作
5. EXCEPTION:记录到异常表
6. CUSTOM:自定义处理逻辑

风哥提示:选择冲突解决策略时,需要根据业务需求和数据重要性进行权衡。

Part02-生产环境规划与建议

2.1 OGG冲突预防策略规划

在生产环境中,预防冲突比解决冲突更重要,需要从架构设计、数据模型、业务逻辑等多个层面进行规划。

预防策略:
1. 数据模型设计:合理设计主键和外键
2. 业务逻辑控制:避免双向同时更新
3. 时间戳机制:使用时间戳判断数据新旧
4. 版本控制:添加版本号字段
5. 冲突检测:提前检测潜在冲突

# 查看表结构
sqlplus fgedu/fgedu123@fgedudb01

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Jan 15 10:00:00 2024

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0

SQL> DESC fgedu01.fgedu_orders
Name Null? Type
—————————————– ——– —————————-
ORDER_ID NOT NULL NUMBER
CUSTOMER_ID NUMBER
ORDER_DATE DATE
ORDER_STATUS VARCHAR2(20)
TOTAL_AMOUNT NUMBER
VERSION NUMBER
UPDATE_TIME DATE

2.2 OGG冲突监控方案设计

建立完善的冲突监控方案,及时发现和处理冲突问题。

监控方案:
1. 实时监控:监控Discard文件
2. 定期检查:定期检查冲突统计
3. 告警机制:冲突达到阈值时告警
4. 日志分析:分析冲突日志找出原因
5. 趋势分析:分析冲突趋势优化配置

# 创建监控脚本
vi /GoldenGate/app/scripts/ogg_conflict_monitor.sh

#!/bin/bash
# ogg_conflict_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/conflict_monitor.log
ALERT_THRESHOLD=10

check_conflicts() {
local replicat=$1
local conflicts=$(echo “STATS REPLICAT $replicat, TOTAL, REPORTCOUNT” | $OGG_HOME/ggsci 2>/dev/null | grep “Total conflicts” | awk ‘{print $3}’)
echo $conflicts
}

echo “========== OGG冲突监控: $(date) ==========” >> $LOG_FILE

for replicat in R_FGEDU01 R_FGEDU02; do
conflicts=$(check_conflicts $replicat)
echo “Replicat $replicat: 冲突数=$conflicts” >> $LOG_FILE

if [ “$conflicts” -gt “$ALERT_THRESHOLD” ]; then
echo “警告: Replicat $replicat 冲突数超过阈值 $ALERT_THRESHOLD” >> $LOG_FILE
fi
done

2.3 OGG冲突恢复方案规划

制定完善的冲突恢复方案,确保在发生冲突时能够快速恢复。

恢复方案:
1. 备份恢复:从备份恢复数据
2. 重放日志:重新应用Trail文件
3. 手动修复:手动修复冲突数据
4. 全量同步:重新进行全量同步
5. 增量修复:只修复冲突数据

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

3.1 OGG主键冲突解决配置

配置OGG处理主键冲突的参数和策略。

# 编辑Replicat参数文件
GGSCI (fgedu.net.cn)> EDIT PARAMS R_FGEDU01

— Replicat参数配置
REPLICAT R_FGEDU01
USERID fgedu, PASSWORD fgedu123
ASSUMETARGETDEFS

— 冲突解决配置
REPERROR (DEFAULT, EXCEPTION)
REPERROR (-1, EXCEPTION)
REPERROR (-1403, EXCEPTION)

— 异常表配置
EXCEPTIONTABLE fgedu.ogg_exceptions

— 映射配置
MAP fgedu01.fgedu_orders, TARGET fgedu01.fgedu_orders;
MAP fgedu01.fgedu_products, TARGET fgedu01.fgedu_products;

# 创建异常表
SQL> CREATE TABLE fgedu.ogg_exceptions (
table_name VARCHAR2(100),
operation_type VARCHAR2(10),
primary_key VARCHAR2(500),
error_message VARCHAR2(4000),
error_time DATE,
before_data CLOB,
after_data CLOB
);

Table created.

3.2 OGG数据不一致修复配置

配置OGG数据不一致检测和修复机制。

# 创建数据一致性检查脚本
vi /GoldenGate/app/scripts/check_data_consistency.sql

— 数据一致性检查脚本
— from:www.itpux.com.qq113257174.wx:itpux-com
— web: http://www.fgedu.net.cn

SET SERVEROUTPUT ON

DECLARE
v_count_src NUMBER;
v_count_tgt NUMBER;
v_diff NUMBER;
BEGIN
— 检查fgedu_orders表
EXECUTE IMMEDIATE ‘SELECT COUNT(*) FROM fgedu01.fgedu_orders@fgedudb01_src’ INTO v_count_src;
EXECUTE IMMEDIATE ‘SELECT COUNT(*) FROM fgedu01.fgedu_orders’ INTO v_count_tgt;

v_diff := ABS(v_count_src – v_count_tgt);

DBMS_OUTPUT.PUT_LINE(‘fgedu_orders: 源端=’ || v_count_src || ‘, 目标端=’ || v_count_tgt || ‘, 差异=’ || v_diff);

IF v_diff > 0 THEN
DBMS_OUTPUT.PUT_LINE(‘警告: fgedu_orders表存在数据不一致’);
END IF;
END;
/

EXIT;

# 执行一致性检查
sqlplus fgedu/fgedu123@fgedudb01 @/GoldenGate/app/scripts/check_data_consistency.sql

SQL*Plus: Release 19.0.0.0.0

Connected.

fgedu_orders: 源端=1256789, 目标端=1256789, 差异=0

PL/SQL procedure successfully completed.

Disconnected from Oracle Database 19c Enterprise Edition

3.3 OGG冲突日志分析配置

配置OGG冲突日志分析工具,快速定位冲突原因。

# 创建冲突日志分析脚本
vi /GoldenGate/app/scripts/analyze_conflict.sh

#!/bin/bash
# analyze_conflict.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OGG_HOME=/GoldenGate/app
DISCARD_DIR=$OGG_HOME/dirrpt
LOG_FILE=$OGG_HOME/logs/conflict_analysis.log

analyze_discard_file() {
local discard_file=$1
local table_name=$(grep “Table:” $discard_file | head -1 | awk ‘{print $2}’)
local operation=$(grep “Operation:” $discard_file | head -1 | awk ‘{print $2}’)
local error=$(grep “Error:” $discard_file | head -1 | cut -d: -f2-)

echo “表名: $table_name” >> $LOG_FILE
echo “操作: $operation” >> $LOG_FILE
echo “错误: $error” >> $LOG_FILE
echo “—” >> $LOG_FILE
}

echo “========== 冲突日志分析: $(date) ==========” >> $LOG_FILE

for discard_file in $DISCARD_DIR/*.dsc; do
if [ -f “$discard_file” ]; then
analyze_discard_file $discard_file
fi
done

Part04-生产案例与实战讲解

4.1 OGG主键冲突解决实战案例

本案例展示如何解决OGG主键冲突问题。

# 查看主键冲突详情
GGSCI (fgedu.net.cn)> VIEW REPORT R_FGEDU01 | grep -A 10 “Duplicate key”

Table: fgedu01.fgedu_orders
Conflict: Duplicate key on insert
Timestamp: 2024-01-15 10:30:15
Operation: INSERT
Primary Key: order_id = 1001234
Error: ORA-00001: unique constraint violated
Before Data: (null)
After Data: order_id=1001234, customer_id=500123, order_date=2024-01-15

# 查询冲突记录
SQL> SELECT * FROM fgedu01.fgedu_orders WHERE order_id = 1001234;

ORDER_ID CUSTOMER_ID ORDER_DATE ORDER_STATUS TOTAL_AMOUNT VERSION UPDATE_TIME
——– ———– ——————- ———— ———– ———- ——————-
1001234 500123 2024-01-15 09:00:00 PENDING 1500.00 1 2024-01-15 09:00:00

# 使用版本号解决冲突
SQL> UPDATE fgedu01.fgedu_orders
SET customer_id = 500124,
total_amount = 1600.00,
version = version + 1,
update_time = SYSDATE
WHERE order_id = 1001234
AND version = 1;

1 row updated.

# 重启Replicat进程
GGSCI (fgedu.net.cn)> START REPLICAT R_FGEDU01

Sending START request to MANAGER …
REPLICAT R_FGEDU01 starting

Replicat started successfully.

4.2 OGG数据不一致修复实战

展示如何修复OGG数据不一致问题。

# 检测数据不一致
SQL> SELECT COUNT(*) FROM fgedu01.fgedu_orders
MINUS
SELECT COUNT(*) FROM fgedu01.fgedu_orders@fgedudb01_src;

COUNT(*)
———-
23

# 找出缺失的记录
SQL> SELECT order_id FROM fgedu01.fgedu_orders@fgedudb01_src
MINUS
SELECT order_id FROM fgedu01.fgedu_orders;

ORDER_ID
———-
1001235
1001236
1001237

23 rows selected.

# 创建临时表存储缺失记录
SQL> CREATE TABLE fgedu01.fgedu_orders_temp AS
SELECT * FROM fgedu01.fgedu_orders@fgedudb01_src
WHERE order_id IN (
SELECT order_id FROM fgedu01.fgedu_orders@fgedudb01_src
MINUS
SELECT order_id FROM fgedu01.fgedu_orders
);

Table created.

23 rows created.

# 插入缺失记录
SQL> INSERT INTO fgedu01.fgedu_orders
SELECT * FROM fgedu01.fgedu_orders_temp;

23 rows created.

# 验证数据一致性
SQL> SELECT COUNT(*) FROM fgedu01.fgedu_orders
MINUS
SELECT COUNT(*) FROM fgedu01.fgedu_orders@fgedudb01_src;

COUNT(*)
———-
0

4.3 OGG冲突自动化处理实战

展示如何实现OGG冲突的自动化处理。

# 创建自动化冲突处理脚本
vi /GoldenGate/app/scripts/auto_resolve_conflict.sh

#!/bin/bash
# auto_resolve_conflict.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OGG_HOME=/GoldenGate/app
LOG_FILE=$OGG_HOME/logs/auto_resolve.log

resolve_duplicate_key() {
local table_name=$1
local pk_value=$2

echo “处理主键冲突: 表=$table_name, 主键=$pk_value” >> $LOG_FILE

# 使用SQL更新记录
sqlplus -s fgedu/fgedu123@fgedudb01 << EOF
UPDATE $table_name
SET version = version + 1,
update_time = SYSDATE
WHERE order_id = $pk_value;
COMMIT;
EXIT;
EOF
}

# 监控Discard文件
while true; do
for discard_file in $OGG_HOME/dirrpt/*.dsc; do
if [ -f “$discard_file” ]; then
table_name=$(grep “Table:” $discard_file | head -1 | awk ‘{print $2}’)
pk_value=$(grep “Primary Key:” $discard_file | head -1 | awk ‘{print $3}’)

if [ ! -z “$table_name” ] && [ ! -z “$pk_value” ]; then
resolve_duplicate_key $table_name $pk_value
mv $discard_file $discard_file.processed
fi
fi
done
sleep 60
done

Part05-风哥经验总结与分享

5.1 OGG冲突解决最佳实践

基于实际项目经验,总结OGG冲突解决的最佳实践。

最佳实践:
1. 预防为主:设计时避免冲突
2. 监控及时:及时发现冲突
3. 快速响应:快速处理冲突
4. 记录完整:记录所有冲突
5. 持续优化:不断优化配置

风哥提示:建议建立冲突处理流程文档,规范冲突处理步骤。

5.2 OGG冲突预防经验总结

总结OGG冲突预防的经验和技巧。

预防经验:
1. 合理设计主键:使用复合主键
2. 添加时间戳:便于判断数据新旧
3. 版本控制:使用版本号字段
4. 业务控制:避免双向同时更新
5. 定期检查:定期检查数据一致性

5.3 OGG冲突处理工具与脚本

提供OGG冲突处理的常用工具和脚本。

# 创建冲突处理工具包
mkdir -p /GoldenGate/app/tools/conflict_resolution
cd /GoldenGate/app/tools/conflict_resolution

# 创建工具清单
cat > README.txt << 'EOF'
========== OGG冲突处理工具包 ==========

工具列表:
1. check_conflicts.sh – 检查冲突统计
2. analyze_conflict.sh – 分析冲突日志
3. resolve_duplicate_key.sh – 解决主键冲突
4. check_data_consistency.sql – 检查数据一致性
5. auto_resolve_conflict.sh – 自动处理冲突

使用方法:
./check_conflicts.sh [replicat_name]
./analyze_conflict.sh [discard_file]
EOF
cat README.txt

========== OGG冲突处理工具包 ==========

工具列表:
1. check_conflicts.sh – 检查冲突统计
2. analyze_conflict.sh – 分析冲突日志
3. resolve_duplicate_key.sh – 解决主键冲突
4. check_data_consistency.sql – 检查数据一致性
5. auto_resolve_conflict.sh – 自动处理冲突

使用方法:
./check_conflicts.sh [replicat_name]
./analyze_conflict.sh [discard_file]

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

联系我们

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

微信号:itpux-com

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