Oracle GoldenGate 19C抽取trail文件缺列导致副本端列未更新问题求助
OGG 19c集成模式trail未捕获全列问题排查结果
核心根因
你场景中的TRAN_TABLE启用了表压缩,是触发该问题的核心原因,Oracle 19c对压缩表的redo记录逻辑和OGG集成抽取的特性共同导致trail未捕获全量列:
具体原因说明
- 压缩表的补充日志记录规则限制:即使开启了数据库级
SUPPLEMENTAL LOG DATA (ALL) COLUMNS,Oracle 12c及以上版本对压缩表(含OLTP压缩、高级压缩)的UPDATE操作,默认不会在redo日志中记录未修改的列,仅会写入修改列、主键/唯一键列,OGG Extract无法从redo中读取到未记录的列,因此后镜像只有变更列数据。 - 补充日志生效范围校验缺失:库级全列补充日志对部分特殊属性表可能不生效,你没有额外校验过表级补充日志的实际配置,若表本身没有生效的全列补充日志组,即使库级配置正确也不会记录全列数据。
- 空值列更新的优化逻辑影响:你场景中
EffectiveDate是从NULL值更新为非NULL值,压缩表的redo优化逻辑会默认跳过NULL值旧列的记录,进一步加剧了列缺失的问题。
解决方案
- 若允许修改表压缩属性,先关闭该表压缩属性验证:
ALTER TABLE MYSCHEMA.TRAN_TABLE NOCOMPRESS;
执行全量同步该表后重新测试UPDATE操作,确认trail是否可以捕获全列。
2. 若必须保留表压缩属性,手动创建表级强制全列补充日志组:
ALTER TABLE MYSCHEMA.TRAN_TABLE ADD SUPPLEMENTAL LOG GROUP log_group_tran_table (ALL) COLUMNS ALWAYS;
创建完成后重启Extract进程再测试同步。
3. 补充Extract参数配置,开启缺失列主动抓取能力,在Extract参数中添加如下配置:
FETCHOPTIONS FETCHPKUPDATECOLS
配置后OGG抽取时若发现redo中缺少列数据,会主动查询源端表获取对应列值填充到trail中,需确保OGG数据库账号拥有该表的SELECT权限。
验证方法
修改配置后执行测试UPDATE操作,使用logdump查看trail文件的后镜像,确认所有列均有正确值即可。
内容的提问来源于stack exchange,提问作者dowonderatwill
相关产品推荐
相关产品推荐

