OGG再次遇到虚拟列无法处理,导致进程abend二

之前遇到一次虚拟列无法insert 如下链接处理

https://www.cnblogs.com/lvcha001/p/12928811.html

本次再次遇到这个问题,OGG版本Version 12.2.0.1 DB版本11.2.0.4  使用ogg_adapter 转换为SQL语句直接执行

 

一、报错信息

 

Exception in thread "main" oracle.goldengate.util.GGException: Unable to commit transaction, STATUS=ABEND, java.sql.SQLException:
ORA-06550: 第 1 行, 第 442 列: PL/SQL: ORA-00904: "SYS_NC0033$": 标识符无效 ORA-06550: 第 1 行, 第 7 列: PL/SQL: SQL Statement ignored

看到SYS_NCXXX$ 列,可以得到是虚拟列的信息! 什么是虚拟列? 对表创建函数索引,Oracle内置会自动创建一个虚拟列,使用OGG同步无法处理会报错,OGG认为虚拟列也是一个字段!!!
需要进行处置
参考上述链接,无法处理这个问题!

使用源端cols不包含虚拟列捕获,目标端COLMAP 参数,排除虚拟列,无法取得效果!

二、问题处理

 

目标端新增一个字段-及虚拟列名称
让其一一对应!
alter table xx add
SYS_NC0033$ varchar2(500);

 

三、学习MOS文章

复制异常与 OGG-01920 缺少 COMPARECOLS 列 <Column_Name> 在前图像(文档 ID 2290491.1)    
Oracle GoldenGate - 版本 11.2.1.0.14 及更高版本
本文档中的信息适用于任何平台。
2015-09-18 03:52:31 错误 OGG-01920 之前图像中缺少 COMPARECOLS 列 <column_name>,同时映射到目标表 <schema.table_name>。将该列添加到 GETBEFORECOLS。

原因
不捕获虚拟列
Oracle GoldenGate 支持具有虚拟列的表,但不捕获这些列的更改数据或将更改数据应用于它们。不会记录虚拟列,并且 Oracle 不允许对虚拟列进行 DML。

您可以在复制中使用以下地图
MAP schemaname.tablename, TARGET schemaname.tablename, 
COMPARECOLS ( 
ON UPDATE ALLEXCLUDING ( LN_OF_BIZ,ALERT_TYPE,RSN_TYP ), 
ON DELETE ALLEXCLUDING ( LN_OF_BIZ,ALERT_TYPE,RSN_TYP )), 
RESOLVECONFLICT , RESOLVECONFLICT, RESOLVECONFLICT , (SOLFLFULEXTREMS), 
RESOLVECONFLICT , CONFLDEXITRICT (INSERTROWEXISTS, (DEFAULT, USEMAX (REPCONFLICT_TMSTP))), 
RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE))); 
或者,
您也可以将 FETCHCOLS (TEST1,TEST2,TEST3) 用于 Extract 中的表映射。

从这里看,处理思路就是要么把虚拟列排除,和我文章中写的思路是一样的,另外一种呢就是把虚拟列也作为普通字段,源端进行抽取!!!

 

posted @ 2020-12-25 15:28  绿茶有点甜  阅读(501)  评论(0编辑  收藏  举报