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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:   考虑到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日志并进行多维度分析。
目录
相关文章
|
8月前
|
C++
C++ 捕获所有异常并拿到错误原因的方法
C++ 捕获所有异常并拿到错误原因的方法
247 0
|
2月前
|
Java
如何捕获和处理 EOFException 异常
EOFException 异常通常在尝试从输入流中读取数据但已到达文件末尾时抛出。要捕获和处理该异常,可以使用 try-catch 语句块,在 catch 块中进行相应的错误处理或提示。例如: ```java try { // 读取数据的代码 } catch (EOFException e) { System.out.println("已到达文件末尾"); } ```
225 4
|
8月前
|
安全 Java 程序员
【C++】异常 -- 详解
【C++】异常 -- 详解
|
3月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
7月前
|
Java
JavaSE——异常(2/2)-异常的处理(记录异常并提示 、尝试重新修复)
JavaSE——异常(2/2)-异常的处理(记录异常并提示 、尝试重新修复)
61 1
|
前端开发 rax Linux
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常
153 0
|
Java 程序员 API
异常(上)概述,捕捉异常,try-catch语句的详细使用
异常(上)概述,捕捉异常,try-catch语句的详细使用
236 0
|
存储 JSON 数据格式
SSB配置异常引起的问题
这篇是两个SSB配置异常导致的问题总结,第一个问题很简单,但是由于第一次看到这种log,看起来也比较蒙,另外也是没想到还能有这么弱鸡的问题;之后又遇到了另外一个SSB相关的问题,因为涉及时频域资源的确定,看起来相对来说就比较费劲,这两个都是lab问题。
有关异常的处理、捕获、抛出、自定义
有关异常的处理、捕获、抛出、自定义
115 0