本文档风哥主要介绍Oracle GoldenGate数据校验与对比的实战操作,包括Oracle GoldenGate数据校验的概念、方法、策略、实施步骤等内容,由风哥教程参考Oracle官方文档GoldenGate文档,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 Oracle GoldenGate数据校验概念
Oracle GoldenGate数据校验是指在数据复制过程中,通过对比源端和目标端数据的一致性,确保复制数据准确性的过程。数据校验是GoldenGate运维管理的重要环节,可以及时发现和解决数据不一致问题。更多视频教程www.fgedu.net.cn
- 验证源端和目标端数据一致性
- 发现数据复制过程中的异常
- 确保业务数据准确性
- 提供数据质量报告
- 支持故障排查和问题定位
1.2 Oracle GoldenGate数据校验方法
Oracle GoldenGate数据校验主要有以下几种方法:
- 记录数校验:对比源端和目标表的记录数量
- 校验和对比:使用ORA_HASH或CHECKSUM计算数据校验和
- 抽样对比:随机抽取样本数据进行详细对比
- 全表对比:逐行对比源端和目标端数据
- 增量校验:只校验增量变化的数据
1.3 Oracle GoldenGate数据校验重要性
Oracle GoldenGate数据校验的重要性:
- 数据质量保证:确保复制数据的准确性和完整性
- 故障及时发现:及时发现复制异常和数据不一致
- 业务连续性:为切换提供数据一致性保证
- 合规要求:满足数据一致性审计要求
- 问题定位:帮助快速定位和解决复制问题
Part02-生产环境规划与建议
2.1 Oracle GoldenGate数据校验规划
Oracle GoldenGate数据校验规划要点:
– 关键业务表:每天校验
– 重要业务表:每周校验
– 一般业务表:每月校验
– 初始加载后:必须校验
– 故障恢复后:必须校验
# 校验方法规划
– 记录数校验:所有表
– 校验和对比:重要表
– 抽样对比:大表
– 全表对比:关键表
# 校验时间规划
– 选择业务低峰期
– 避开备份窗口
– 避开统计信息收集时间
# 校验资源规划
– 评估校验对系统性能的影响
– 预留足够的CPU和IO资源
– 考虑并行校验策略
2.2 Oracle GoldenGate数据校验策略
Oracle GoldenGate数据校验策略:
第一层:记录数校验(所有表)
– 快速发现数据差异
– 执行时间短
– 资源消耗低
第二层:校验和对比(重要表)
– 发现数据内容差异
– 执行时间中等
– 资源消耗中等
第三层:抽样对比(大表)
– 验证数据准确性
– 执行时间较长
– 资源消耗较高
第四层:全表对比(关键表)
– 完全验证数据一致性
– 执行时间最长
– 资源消耗最高
2.3 Oracle GoldenGate数据校验最佳实践
Oracle GoldenGate数据校验最佳实践:
- 定期校验:建立定期数据校验机制
- 分层校验:根据表重要性采用不同校验方法
- 自动化:使用脚本实现自动化校验
- 报告记录:保存校验结果,便于追溯
- 及时处理:发现不一致及时处理
- 监控告警:配置校验失败告警
Part03-生产环境项目实施方案
3.1 Oracle GoldenGate记录数校验
3.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 <
EOF
)
# 目标端记录数
TARGET_COUNT=$(sqlplus -s $TARGET_CONN <
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计算校验和
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计算校验和
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 随机抽样对比
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 按时间抽样对比
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
# 结果:无差异记录
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 <
EOF
)
# 获取目标表总记录数
TARGET_TOTAL=$(sqlplus -s fgedu/password@fgedudb_target <
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 <
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 <
EXIT;
EOF
)
TARGET_NEW=$(sqlplus -s fgedu/password@fgedudb_target <
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 <
EXIT;
EOF
)
TARGET_HASH=$(sqlplus -s fgedu/password@fgedudb_target <
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. 从源端导出缺失数据
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
Part05-风哥经验总结与分享
5.1 Oracle GoldenGate数据校验总结
Oracle GoldenGate数据校验的关键要点:
- 定期校验:建立定期数据校验机制,及时发现问题
- 分层校验:根据表重要性采用不同校验方法
- 自动化:使用脚本实现自动化校验和报告
- 及时处理:发现不一致及时处理,避免问题扩大
- 记录保存:保存校验结果,便于追溯和分析
5.2 Oracle GoldenGate数据校验检查清单
Oracle GoldenGate数据校验检查清单:
□ 确定校验范围和校验方法
□ 评估校验对系统性能的影响
□ 选择合适的时间窗口
□ 准备校验脚本和工具
□ 备份重要数据
# 校验中检查清单
□ 监控校验进度
□ 监控系统资源使用
□ 记录校验结果
□ 及时处理异常情况
# 校验后检查清单
□ 分析校验结果
□ 处理不一致数据
□ 生成校验报告
□ 更新校验记录
5.3 Oracle GoldenGate数据校验自动化
Oracle GoldenGate数据校验自动化建议:
- 定时任务:使用crontab配置定时校验任务
- 监控告警:配置校验失败告警通知
- 报告生成:自动生成校验报告并发送邮件
- 历史记录:保存历史校验结果,便于趋势分析
- 可视化:使用图表展示校验结果和趋势
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
