1. 首页 > Oracle教程 > 正文

Oracle教程FG249-Oracle GoldenGate数据校验与对比实战

本文档风哥主要介绍Oracle GoldenGate数据校验与对比的实战操作,包括Oracle GoldenGate数据校验的概念、方法、策略、实施步骤等内容,由风哥教程参考Oracle官方文档GoldenGate文档,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 Oracle GoldenGate数据校验概念

Oracle GoldenGate数据校验是指在数据复制过程中,通过对比源端和目标端数据的一致性,确保复制数据准确性的过程。数据校验是GoldenGate运维管理的重要环节,可以及时发现和解决数据不一致问题。更多视频教程www.fgedu.net.cn

Oracle GoldenGate数据校验的主要目的:

  • 验证源端和目标端数据一致性
  • 发现数据复制过程中的异常
  • 确保业务数据准确性
  • 提供数据质量报告
  • 支持故障排查和问题定位

1.2 Oracle GoldenGate数据校验方法

Oracle GoldenGate数据校验主要有以下几种方法:

  • 记录数校验:对比源端和目标表的记录数量
  • 校验和对比:使用ORA_HASH或CHECKSUM计算数据校验和
  • 抽样对比:随机抽取样本数据进行详细对比
  • 全表对比:逐行对比源端和目标端数据
  • 增量校验:只校验增量变化的数据

1.3 Oracle GoldenGate数据校验重要性

Oracle GoldenGate数据校验的重要性:

  • 数据质量保证:确保复制数据的准确性和完整性
  • 故障及时发现:及时发现复制异常和数据不一致
  • 业务连续性:为切换提供数据一致性保证
  • 合规要求:满足数据一致性审计要求
  • 问题定位:帮助快速定位和解决复制问题
风哥提示:数据校验是GoldenGate运维的核心工作之一。建议定期进行数据校验,特别是在初始加载完成、重大变更后、故障恢复后等关键时间点。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 Oracle GoldenGate数据校验规划

Oracle GoldenGate数据校验规划要点:

# 校验频率规划
– 关键业务表:每天校验
– 重要业务表:每周校验
– 一般业务表:每月校验
– 初始加载后:必须校验
– 故障恢复后:必须校验

# 校验方法规划
– 记录数校验:所有表
– 校验和对比:重要表
– 抽样对比:大表
– 全表对比:关键表

# 校验时间规划
– 选择业务低峰期
– 避开备份窗口
– 避开统计信息收集时间

# 校验资源规划
– 评估校验对系统性能的影响
– 预留足够的CPU和IO资源
– 考虑并行校验策略

2.2 Oracle GoldenGate数据校验策略

Oracle GoldenGate数据校验策略:

# 分层校验策略
第一层:记录数校验(所有表)
– 快速发现数据差异
– 执行时间短
– 资源消耗低

第二层:校验和对比(重要表)
– 发现数据内容差异
– 执行时间中等
– 资源消耗中等

第三层:抽样对比(大表)
– 验证数据准确性
– 执行时间较长
– 资源消耗较高

第四层:全表对比(关键表)
– 完全验证数据一致性
– 执行时间最长
– 资源消耗最高

2.3 Oracle GoldenGate数据校验最佳实践

Oracle GoldenGate数据校验最佳实践:

  • 定期校验:建立定期数据校验机制
  • 分层校验:根据表重要性采用不同校验方法
  • 自动化:使用脚本实现自动化校验
  • 报告记录:保存校验结果,便于追溯
  • 及时处理:发现不一致及时处理
  • 监控告警:配置校验失败告警
生产环境建议:数据校验要考虑对系统性能的影响,建议在业务低峰期进行。对于大表,可以采用抽样校验或分区校验的方式。学习交流加群风哥QQ113257174

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

3.1 Oracle GoldenGate记录数校验

3.1.1 单表记录数校验

# 1. 源端查询记录数
SQL> conn fgedu/password@fgedudb_source
Connected.

SQL> SELECT COUNT(*) FROM fgedu.fgedu_orders;

COUNT(*)
———-
10000000

# 2. 目标端查询记录数
SQL> conn fgedu/password@fgedudb_target
Connected.

SQL> SELECT COUNT(*) FROM fgedu.fgedu_orders;

COUNT(*)
———-
10000000

# 3. 对比结果
# 源端记录数:10000000
# 目标端记录数:10000000
# 差异:0
# 状态:一致

3.1.2 批量记录数校验

# 创建校验脚本
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# verify_count.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# 配置数据库连接
SOURCE_CONN=”fgedu/password@fgedudb_source”
TARGET_CONN=”fgedu/password@fgedudb_target”

# 校验表列表
TABLES=”fgedu_orders fgedu_customers fgedu_products fgedu_order_items”

# 日志文件
LOG_FILE=”/oracle/goldengate/verify/verify_count_$(date +%Y%m%d).log”

echo “========================================” >> $LOG_FILE
echo “记录数校验开始: $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE

for TABLE in $TABLES; do
echo “” >> $LOG_FILE
echo “校验表: $TABLE” >> $LOG_FILE

# 源端记录数
SOURCE_COUNT=$(sqlplus -s $SOURCE_CONN < EXIT;
EOF
)

# 目标端记录数
TARGET_COUNT=$(sqlplus -s $TARGET_CONN < EXIT;
EOF
)

# 计算差异
DIFF=$(($SOURCE_COUNT – $TARGET_COUNT))

if [ $DIFF -eq 0 ]; then
STATUS=”一致”
else
STATUS=”不一致”
fi

echo “源端记录数: $SOURCE_COUNT” >> $LOG_FILE
echo “目标端记录数: $TARGET_COUNT” >> $LOG_FILE
echo “差异: $DIFF” >> $LOG_FILE
echo “状态: $STATUS” >> $LOG_FILE

done

echo “” >> $LOG_FILE
echo “========================================” >> $LOG_FILE
echo “记录数校验结束: $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE

# 执行脚本
$ chmod +x verify_count.sh
$ ./verify_count.sh

# 查看结果
$ cat /oracle/goldengate/verify/verify_count_20260403.log

========================================
记录数校验开始: Thu Apr 3 16:30:00 CST 2026
========================================

校验表: fgedu_orders
源端记录数: 10000000
目标端记录数: 10000000
差异: 0
状态: 一致

校验表: fgedu_customers
源端记录数: 5000000
目标端记录数: 5000000
差异: 0
状态: 一致

校验表: fgedu_products
源端记录数: 100000
目标端记录数: 100000
差异: 0
状态: 一致

校验表: fgedu_order_items
源端记录数: 25000000
目标端记录数: 25000000
差异: 0
状态: 一致

========================================
记录数校验结束: Thu Apr 3 16:35:00 CST 2026
========================================

3.2 Oracle GoldenGate校验和对比

3.2.1 使用ORA_HASH计算校验和

# 1. 源端计算校验和
SQL> SELECT SUM(ORA_HASH(order_id || ‘|’ || customer_id || ‘|’ || order_amount)) AS checksum
FROM fgedu.fgedu_orders;

CHECKSUM
———-
1234567890

# 2. 目标端计算校验和
SQL> SELECT SUM(ORA_HASH(order_id || ‘|’ || customer_id || ‘|’ || order_amount)) AS checksum
FROM fgedu.fgedu_orders;

CHECKSUM
———-
1234567890

# 3. 对比结果
# 源端校验和:1234567890
# 目标端校验和:1234567890
# 状态:一致

3.2.2 使用DBMS_CRYPTO计算校验和

# 1. 创建校验和计算函数
CREATE OR REPLACE FUNCTION fgedu.get_table_checksum(p_table_name IN VARCHAR2)
RETURN VARCHAR2 IS
v_checksum VARCHAR2(100);
v_sql VARCHAR2(1000);
BEGIN
v_sql := ‘SELECT RAWTOHEX(DBMS_CRYPTO.HASH(‘ ||
‘(SELECT LISTAGG(order_id || customer_id || order_amount, ”,”) ‘ ||
‘WITHIN GROUP (ORDER BY order_id) FROM ‘ || p_table_name || ‘), ‘ ||
‘DBMS_CRYPTO.HASH_MD5)) FROM DUAL’;

EXECUTE IMMEDIATE v_sql INTO v_checksum;

RETURN v_checksum;
END;
/

# 2. 源端计算校验和
SQL> SELECT fgedu.get_table_checksum(‘FGEDU_ORDERS’) FROM DUAL;

GET_TABLE_CHECKSUM(‘FGEDU_ORDERS’)
———————————–
5D41402ABC4B2A76B9719D911017C592

# 3. 目标端计算校验和
SQL> SELECT fgedu.get_table_checksum(‘FGEDU_ORDERS’) FROM DUAL;

GET_TABLE_CHECKSUM(‘FGEDU_ORDERS’)
———————————–
5D41402ABC4B2A76B9719D911017C592

# 4. 对比结果
# 源端校验和:5D41402ABC4B2A76B9719D911017C592
# 目标端校验和:5D41402ABC4B2A76B9719D911017C592
# 状态:一致

3.3 Oracle GoldenGate抽样对比

3.3.1 随机抽样对比

# 1. 源端随机抽样
SQL> SELECT order_id, customer_id, order_amount, order_status
FROM fgedu.fgedu_orders
WHERE MOD(ORA_HASH(order_id), 1000) = 0
AND ROWNUM <= 100;

ORDER_ID CUSTOMER_ID ORDER_AMOUNT ORDER_STATUS
———- ———– ———— ————
1000 1000 1500.00 Completed
2000 2000 2300.00 Pending
3000 3000 1800.00 Completed

# 2. 目标端随机抽样
SQL> SELECT order_id, customer_id, order_amount, order_status
FROM fgedu.fgedu_orders
WHERE MOD(ORA_HASH(order_id), 1000) = 0
AND ROWNUM <= 100;

ORDER_ID CUSTOMER_ID ORDER_AMOUNT ORDER_STATUS
———- ———– ———— ————
1000 1000 1500.00 Completed
2000 2000 2300.00 Pending
3000 3000 1800.00 Completed

# 3. 抽样对比结果
# 抽样数量:100条
# 一致数量:100条
# 不一致数量:0条
# 一致率:100%

3.3.2 按时间抽样对比

# 1. 源端按时间抽样
SQL> SELECT order_id, customer_id, order_amount, order_date
FROM fgedu.fgedu_orders
WHERE order_date >= TRUNC(SYSDATE – 1)
AND order_date < TRUNC(SYSDATE) AND ROWNUM <= 1000;

ORDER_ID CUSTOMER_ID ORDER_AMOUNT ORDER_DATE
———- ———– ———— ——————-
9000001 1000001 2500.00 2026-04-02 10:30:00
9000002 1000002 1800.00 2026-04-02 11:15:00
9000003 1000003 3200.00 2026-04-02 14:20:00

# 2. 目标端按时间抽样
SQL> SELECT order_id, customer_id, order_amount, order_date
FROM fgedu.fgedu_orders
WHERE order_date >= TRUNC(SYSDATE – 1)
AND order_date < TRUNC(SYSDATE) AND ROWNUM <= 1000;

ORDER_ID CUSTOMER_ID ORDER_AMOUNT ORDER_DATE
———- ———– ———— ——————-
9000001 1000001 2500.00 2026-04-02 10:30:00
9000002 1000002 1800.00 2026-04-02 11:15:00
9000003 1000003 3200.00 2026-04-02 14:20:00

# 3. 详细对比
SQL> SELECT s.order_id, s.order_amount AS source_amount,
t.order_amount AS target_amount
FROM fgedu.fgedu_orders@source s
FULL OUTER JOIN fgedu.fgedu_orders t ON s.order_id = t.order_id
WHERE s.order_id IS NULL OR t.order_id IS NULL
OR s.order_amount != t.order_amount
AND s.order_date >= TRUNC(SYSDATE – 1);

no rows selected

# 结果:无差异记录

风哥提示:抽样对比是大表数据校验的有效方法。建议根据表大小和数据特点选择合适的抽样比例,通常抽样1%-5%即可发现大部分数据不一致问题。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 Oracle GoldenGate全表校验案例

以下是一个全表校验的完整案例:

# 场景:关键业务表全表校验

# 1. 创建全表校验脚本
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# full_verify.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

TABLE_NAME=”FGEDU_ORDERS”
BATCH_SIZE=10000
LOG_FILE=”/oracle/goldengate/verify/full_verify_${TABLE_NAME}_$(date +%Y%m%d).log”

echo “开始全表校验: $TABLE_NAME” >> $LOG_FILE
echo “开始时间: $(date)” >> $LOG_FILE

# 获取源表总记录数
SOURCE_TOTAL=$(sqlplus -s fgedu/password@fgedudb_source < EXIT;
EOF
)

# 获取目标表总记录数
TARGET_TOTAL=$(sqlplus -s fgedu/password@fgedudb_target < EXIT;
EOF
)

echo “源表记录数: $SOURCE_TOTAL” >> $LOG_FILE
echo “目标表记录数: $TARGET_TOTAL” >> $LOG_FILE

# 如果记录数一致,进行详细对比
if [ $SOURCE_TOTAL -eq $TARGET_TOTAL ]; then
echo “记录数一致,进行详细对比…” >> $LOG_FILE

# 使用MINUS进行全表对比
DIFF_COUNT=$(sqlplus -s fgedu/password@fgedudb_source < EXIT;
EOF
)

echo “差异记录数: $DIFF_COUNT” >> $LOG_FILE

if [ $DIFF_COUNT -eq 0 ]; then
echo “校验结果: 完全一致” >> $LOG_FILE
else
echo “校验结果: 存在差异” >> $LOG_FILE
fi
else
echo “记录数不一致,跳过详细对比” >> $LOG_FILE
fi

echo “结束时间: $(date)” >> $LOG_FILE

# 2. 执行校验
$ chmod +x full_verify.sh
$ ./full_verify.sh

# 3. 查看结果
$ cat /oracle/goldengate/verify/full_verify_FGEDU_ORDERS_20260403.log

开始全表校验: FGEDU_ORDERS
开始时间: Thu Apr 3 17:00:00 CST 2026
源表记录数: 10000000
目标表记录数: 10000000
记录数一致,进行详细对比…
差异记录数: 0
校验结果: 完全一致
结束时间: Thu Apr 3 17:30:00 CST 2026

4.2 Oracle GoldenGate增量校验案例

以下是一个增量校验的完整案例:

# 场景:每天增量数据校验

# 1. 创建增量校验脚本
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# incremental_verify.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

TABLE_NAME=”FGEDU_ORDERS”
VERIFY_DATE=$(date +%Y%m%d)
LOG_FILE=”/oracle/goldengate/verify/incremental_verify_${TABLE_NAME}_${VERIFY_DATE}.log”

echo “开始增量校验: $TABLE_NAME” >> $LOG_FILE
echo “校验日期: $VERIFY_DATE” >> $LOG_FILE
echo “开始时间: $(date)” >> $LOG_FILE

# 获取当天新增记录数
SOURCE_NEW=$(sqlplus -s fgedu/password@fgedudb_source <= TRUNC(SYSDATE) AND created_at < TRUNC(SYSDATE) + 1;
EXIT;
EOF
)

TARGET_NEW=$(sqlplus -s fgedu/password@fgedudb_target <= TRUNC(SYSDATE) AND created_at < TRUNC(SYSDATE) + 1;
EXIT;
EOF
)

echo “源端当天新增记录数: $SOURCE_NEW” >> $LOG_FILE
echo “目标端当天新增记录数: $TARGET_NEW” >> $LOG_FILE

# 对比当天新增记录
if [ $SOURCE_NEW -eq $TARGET_NEW ]; then
echo “当天新增记录数一致” >> $LOG_FILE

# 校验新增记录的校验和
SOURCE_HASH=$(sqlplus -s fgedu/password@fgedudb_source <= TRUNC(SYSDATE) AND created_at < TRUNC(SYSDATE) + 1;
EXIT;
EOF
)

TARGET_HASH=$(sqlplus -s fgedu/password@fgedudb_target <= TRUNC(SYSDATE) AND created_at < TRUNC(SYSDATE) + 1;
EXIT;
EOF
)

echo “源端新增记录校验和: $SOURCE_HASH” >> $LOG_FILE
echo “目标端新增记录校验和: $TARGET_HASH” >> $LOG_FILE

if [ “$SOURCE_HASH” = “$TARGET_HASH” ]; then
echo “增量校验结果: 一致” >> $LOG_FILE
else
echo “增量校验结果: 不一致” >> $LOG_FILE
fi
else
echo “当天新增记录数不一致” >> $LOG_FILE
fi

echo “结束时间: $(date)” >> $LOG_FILE

# 2. 添加到crontab定时执行
echo “0 2 * * * /oracle/goldengate/verify/incremental_verify.sh” | crontab

# 3. 查看结果
$ cat /oracle/goldengate/verify/incremental_verify_FGEDU_ORDERS_20260403.log

开始增量校验: FGEDU_ORDERS
校验日期: 20260403
开始时间: Thu Apr 3 02:00:00 CST 2026
源端当天新增记录数: 15000
目标端当天新增记录数: 15000
当天新增记录数一致
源端新增记录校验和: 987654321
目标端新增记录校验和: 987654321
增量校验结果: 一致
结束时间: Thu Apr 3 02:05:00 CST 2026

4.3 Oracle GoldenGate数据不一致处理

4.3.1 发现数据不一致

# 问题现象:校验发现数据不一致

# 1. 记录数不一致
SQL> — 源端
SQL> SELECT COUNT(*) FROM fgedu.fgedu_orders;

COUNT(*)
———-
10000000

SQL> — 目标端
SQL> SELECT COUNT(*) FROM fgedu.fgedu_orders;

COUNT(*)
———-
9999995

# 差异:目标端少5条记录

# 2. 查找缺失记录
SQL> SELECT order_id FROM fgedu.fgedu_orders@source
MINUS
SELECT order_id FROM fgedu.fgedu_orders;

ORDER_ID
———-
10001
10002
10003
10004
10005

# 3. 分析原因
# – 可能是Replicat进程跳过或丢弃了这些记录
# – 可能是目标端约束导致插入失败

# 4. 查看Replicat报告
GGSCI (fgedu-target.net.cn) 1> view report rep01

2026-04-03 15:00:00 WARNING OGG-01004 Oracle GoldenGate Delivery for Oracle, rep01.prm: Aborted grouped transaction.
2026-04-03 15:00:00 ERROR OGG-01296 Oracle GoldenGate Delivery for Oracle, rep01.prm: Error mapping from FGEDU.FGEDU_ORDERS to FGEDU.FGEDU_ORDERS.
2026-04-03 15:00:00 ERROR OGG-01161 Oracle GoldenGate Delivery for Oracle, rep01.prm: Bad column index.

4.3.2 数据修复

# 解决方案1:手动修复缺失数据

# 1. 从源端导出缺失数据
SQL> CREATE TABLE fgedu.fgedu_orders_temp AS
SELECT * FROM fgedu.fgedu_orders@source
WHERE order_id IN (10001, 10002, 10003, 10004, 10005);

Table created.

# 2. 插入目标端
SQL> INSERT INTO fgedu.fgedu_orders
SELECT * FROM fgedu.fgedu_orders_temp;

5 rows created.

SQL> COMMIT;

Commit complete.

# 3. 验证修复结果
SQL> SELECT COUNT(*) FROM fgedu.fgedu_orders;

COUNT(*)
———-
10000000

# 解决方案2:使用GoldenGate修复

# 1. 创建修复Extract
GGSCI (fgedu.net.cn) 1> add extract fix_ext, sourceistable

GGSCI (fgedu.net.cn) 2> edit params fix_ext

EXTRACT fix_ext
SETENV (NLS_LANG=”AMERICAN_AMERICA.AL32UTF8″)
USERIDALIAS fgedu_ggadmin
RMTHOST 192.168.1.100, MGRPORT 7809
RMTTASK REPLICAT, GROUP fix_rep

TABLE fgedu.fgedu_orders, FILTER (order_id IN (10001, 10002, 10003, 10004, 10005));

# 2. 创建修复Replicat
GGSCI (fgedu-target.net.cn) 1> add replicat fix_rep, specialrun

GGSCI (fgedu-target.net.cn) 2> edit params fix_rep

REPLICAT fix_rep
SETENV (NLS_LANG=”AMERICAN_AMERICA.AL32UTF8″)
USERIDALIAS fgedu_ggadmin_target

HANDLECOLLISIONS
MAP fgedu.fgedu_orders, TARGET fgedu.fgedu_orders;

# 3. 执行修复
GGSCI (fgedu.net.cn) 3> start extract fix_ext

# 4. 验证修复结果
SQL> SELECT COUNT(*) FROM fgedu.fgedu_orders;

COUNT(*)
———-
10000000

生产环境建议:数据不一致修复要谨慎,建议在修复前备份目标表数据。对于大量数据不一致,建议重新进行初始加载。from oracle:www.itpux.com

Part05-风哥经验总结与分享

5.1 Oracle GoldenGate数据校验总结

Oracle GoldenGate数据校验的关键要点:

  • 定期校验:建立定期数据校验机制,及时发现问题
  • 分层校验:根据表重要性采用不同校验方法
  • 自动化:使用脚本实现自动化校验和报告
  • 及时处理:发现不一致及时处理,避免问题扩大
  • 记录保存:保存校验结果,便于追溯和分析

5.2 Oracle GoldenGate数据校验检查清单

Oracle GoldenGate数据校验检查清单:

# 校验前检查清单
□ 确定校验范围和校验方法
□ 评估校验对系统性能的影响
□ 选择合适的时间窗口
□ 准备校验脚本和工具
□ 备份重要数据

# 校验中检查清单
□ 监控校验进度
□ 监控系统资源使用
□ 记录校验结果
□ 及时处理异常情况

# 校验后检查清单
□ 分析校验结果
□ 处理不一致数据
□ 生成校验报告
□ 更新校验记录

5.3 Oracle GoldenGate数据校验自动化

Oracle GoldenGate数据校验自动化建议:

  • 定时任务:使用crontab配置定时校验任务
  • 监控告警:配置校验失败告警通知
  • 报告生成:自动生成校验报告并发送邮件
  • 历史记录:保存历史校验结果,便于趋势分析
  • 可视化:使用图表展示校验结果和趋势
风哥提示:数据校验是GoldenGate运维的核心工作,建议建立完善的校验体系。通过自动化工具和定期校验,可以有效保障数据复制质量,及时发现和解决问题。更多视频教程www.fgedu.net.cn

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

联系我们

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

微信号:itpux-com

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