Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1244181
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Oracle

2013-04-10 13:37:12

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

阅读(2555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~