zoukankan      html  css  js  c++  java
  • OGG 同步无主键表且目标表多一个隐藏字段

    问题描述:

    已知OGG在同步无主键的表时,OGG会自动设置表的全字段为主键,若目标表字段多于源表,同步过程中replicat进程可以读取insert操作但无法进行update操作,从而导致replicat进程abend。

    探究Oracle12c引入了一个新特性——隐藏字段,若将目标表多的字段隐藏,OGG 是否能进行正常同步。

    环境准备:

    在同一数据库中不同用户下进行ogg同步,源端用户oggs,目标端用户oggt。

      

    源端 创建A表结构:

    SQL > create table oggs.A(id number,name varchar2(12));

      

    目标端 创建A表结构:

    SQL > create table oggt.A(id number,name varchar2(12),time timestamp(6) invisible);

      

    注意:seletc * from…不会出现隐藏字段,必须select隐藏字段才能显示。

      

    OGG 进程配置:

     extract 进程

    extract ex
    dynamicresolution
    userid oggs,password oggs
    exttrail ./dirdat/as
    table oggs.A;

     pump 进程

    extract pu
    rmthost 127.0.0.1, mgrport 7909
    rmttrail ./dirdat/at
    table oggs.A;    

     replicat 进程

    replicat re 
    dboptions integratedparams(parallelism 6) 
    userid oggt, password oggt
    map oggs.A, target oggt.A, colmap(usedefaults, time=@datenow());    

    启动测试:

    启动源端ex、pu进程,目标端re进程

    在启动ex过程中OGG报错: ERROR OGG-02022 Logmining server does not exist on this Oracle database.

    解决方案:GGSCI > register extract ex database

    源端A表插入数据

    SQL> insert into oggs.A values(1,'a');

    1 row inserted

    SQL> commit;

    Commit complete

    SQL> select * from oggs.A;

        ID NAME
    ------ ------------
         1 a

    目标端查询数据是否插入

    SQL> select id,name,time from oggt.A;

             ID NAME    TIME
    ---------- ------------ ------------------------------------------------------------------------------
            1 a         20-9月 -19 02.06.22.000000 下午

     (目标端正常插入数据)

    源端 update 数据

    SQL> update oggs.A set name='b' where id=1;

    1 row updated

    SQL> commit;

    Commit complete

    SQL> select * from oggs.A;

        ID NAME
    ------ ------------
         1 b

    目标端查询数据是否更新

    SQL> select id,name,time from oggt.A;

             ID NAME    TIME
    ---------- ------------ ------------------------------------------------------------------------------
            1 a         20-9月 -19 02.06.22.000000 下午

    (目标端数据未更新,更新失败)

    查看 replicat 进程报告

    GGSCI > view report re

    2019-09-20 14:15:28  ERROR   OGG-01296  Error mapping from OGGS.A to OGGT.A.

    2019-09-20 14:15:34  ERROR   OGG-01668  PROCESS ABENDING.

    Report at 2019-09-20 14:15:34 (activity since 2019-09-20 14:06:22)

    From Table OGGS.A to OGGT.A:

    #                  inserts:          1

    #                  updates:        0

    #                  deletes:         0

    #                  discards:       1

    (显示插入一个数据,丢弃一个数据)

      结果:同步失败。

    re进程更新配置,添加指定keycols(id,name) 使得同源端主键一致

      replicat 进程

    replicat re
    dboptions integratedparams(parallelism 6)
    userid oggt, password oggt
    map oggs.A, target oggt.A, keycols(id,name),colmap(usedefaults, time=@datenow());

    重启re进程,目标端查询数据

    SQL> select id,name,time from oggt.A;

             ID NAME    TIME
    ---------- ------------ ------------------------------------------------------------------------------
            1 b         20-9 -19 02.29.07.000000 下午

    查看 replicat 进程报告

    GGSCI>view report re

    Report at 2019-09-20 14:36:31 (activity since 2019-09-20 14:29:07)

    From Table OGGS.A to OGGT.A:

              #                  inserts:          1

              #                  updates:        1

              #                  deletes:         0

              #                  discards:       0

    (显示插入一个数据,更新一个数据)

             结果:同步正常进行

     

    结论:在同步无主键的表时,即使将目标表的多出的字段隐藏,若不指定keycols,同样会导致OGG 同步update失败。

      因此,在同步没有主键的表时,需在进程中配置keycols或在同步开始之前在数据库中为需要同步的表设定主键。

  • 相关阅读:
    git学习,git上建立自己的项目
    springframework3.2源码下载导入eclipse
    git学习
    java事件处理机制(自定义事件)
    quartz scheduler 2.16 之集群
    博客总目录(2007.11.12 2010.4.25)
    JS中json数据的处理
    (转载)JAVA线程池管理
    查到的一些发送邮件代码的链接
    layui时间控件,获取页面选中的时间值。
  • 原文地址:https://www.cnblogs.com/smandar/p/13996556.html
Copyright © 2011-2022 走看看