配置GoldenGate捕获Replicat端数据应用异常

简介:   考虑到GoldenGate对数据的逻辑处理方式,保不齐目标端可能由于什么原因,没能正确复制源端抽取到的数据,那么,默认情况下,Replicat任务会中止并抛出异常信息。

  考虑到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表,来确定出错的记录和具体原因,方面进一步调试。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
C++
C++ 捕获所有异常并拿到错误原因的方法
C++ 捕获所有异常并拿到错误原因的方法
|
5月前
|
前端开发 rax Linux
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
64 0
|
4月前
|
SQL 搜索推荐 关系型数据库
实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值
实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值
|
5月前
|
SQL
ora-04098 触发器无效且未通过重新验证
ora-04098 触发器无效且未通过重新验证
|
SQL 安全 数据库
故障解决:SQL Server数据库附加失败,错误3415、错误5120
本文为大家分享了SQL Server数据库附加失败的具体解决方法,供大家参考,具体内容如下
故障解决:SQL Server数据库附加失败,错误3415、错误5120
|
SQL 关系型数据库 MySQL
最佳实践—如何正确处理DDL异常
本文介绍处理DDL异常的常用方法。
106 0

热门文章

最新文章