考虑到GoldenGate对数据的逻辑处理方式,保不齐目标端可能由于什么原因,没能正确复制源端抽取到的数据,那么,默认情况下,Replicat任务会中止并抛出异常信息。这里,我们可以通过自定义的方式,定制错误的处理机制。
异常捕获操作均在目标端进行,源端不需要做什么修改。
首先创建一张日志表,用来记录异常信息,这个表的列可以根据实际情况进行定制,并没有强制性的标准:
create table jss.j1_data_change_log
(
REP_NAME VARCHAR2(30),
OID NUMBER,
TABLE_NAME VARCHAR2(30),
OPTYPE VARCHAR2(30),
COMMIT_DATE TIMESTAMP,
DBERRNUM NUMBER,
DBERRMSG VARCHAR2(4000),
LOGRBA NUMBER,
LOGPOSITION NUMBER
);
该表必须拥有唯一索引(当然建个主键也可以的),这里考虑通过时间和日志在文件中的相对位置做唯一键:
- create unique index uni_j1_data_clog on j1_data_change_log (logrba,logposition,commit_date);
GoldenGate中有一个REPERROR选项,专用于replicat进程,可以用来控制replicat进程处理错误错误的方式。
用户可以定义多个REPERROR语句,其中一个REPERROR语句设置默认情况下错误处理方式,其它的REPERROR再来分别对不同的错误指定处理逻辑。这里我们就通过REPERROR来捕获异常信息。
在GoldenGate中修改replicat的配置,具体配置信息如下:
REPLICAT rep2
ASSUMETARGETDEFS
USERID ggate@target, PASSWORD ggate
DISCARDFILE ./dirrpt/rep2_gg2.dsc, PURGE
REPERROR (DEFAULT, EXCEPTION)
REPERROR (DEFAULT2,ABEND)
MAP jss.*, TARGET jss.*;
MAP jss.j1, target jss.j1_data_change_log,
EXCEPTIONSONLY,
INSERTALLRECORDS,
COLMAP ( rep_name = "rep2"
,oid = id
,table_name = @GETENV("GGHEADER","TABLENAME")
,optype = @GETENV ("GGHEADER", "OPTYPE")
,commit_date = @GETENV ("GGHEADER", "COMMITTIMESTAMP")
,dberrnum = @GETENV ("LASTERR", "DBERRNUM")
,dberrmsg = @GETENV ("LASTERR", "DBERRMSG")
,logrba = @GETENV ("GGHEADER", "LOGRBA")
,logposition = @GETENV ("GGHEADER", "LOGPOSITION"));
主要意图就是通过GETENV取到想要的环境变量信息,并存入前面创建的日志表。
提示:注意MAP/COLMAP等关键字间,",/("等符号前必须要有空格,否则会遇到OGG-00212 Invalid option for MAP的错误信息。
注意2,源端对象必须执行add trandata schema.table启用表级附加日志,否则在源端执行update操作时,目前端会抛出ORA-01403错误,提示记录找不到
当再执行同步时,目标端REPLICAT组的REPORT文件中会记录类似这样的信息:
MAP resolved (entry JSS.J1):
MAP JSS.J1, target jss.j1_data_change_log, EXCEPTIONSONLY, INSERTALLRECORDS, COLMAP ( rep_name = "rep2" ,oid = id ,table_name = @GETENV("GGHEADER","TABLENAME") ,optype = @GETENV ("GGHEADER", "OPTYPE") ,co
mmit_date = @GETENV ("GGHEADER", "COMMITTIMESTAMP") ,dberrnum = @GETENV ("LASTERR", "DBERRNUM") ,dberrmsg = @GETENV ("LASTERR", "DBERRMSG") ,logrba = @GETENV ("GGHEADER", "LOGRBA") ,logposition = @GETENV ("G
GHEADER", "LOGPOSITION"));
Using the following key columns for target table JSS.J1_DATA_CHANGE_LOG: LOGRBA, LOGPOSITION, COMMIT_DATE.
如果遇到错误,可以直接通过查询jss.j1_data_change_log表,来确定出错的记录和具体原因,方面进一步调试。