• X Oracle Data Integrator 12c----简单CDC(Simple CDC)


    https://www.cnblogs.com/xqzt/p/4510830.html

    Simple CDC最简单的一种 CDC。在这里,每一张 CDC 的表的变化都是独立捕获的,不需要考虑多张存在主外键引用关系的表之间的数据一致性。

    1 环境准备

    源表:ODI_SRC.DEPT

    目标表:ODI_TAG.DEPT

    配置拓扑结构见ODI Studio拓扑结构的创建与配置(Oracle)

    模型反向工程见:Oracle Data Integrator 12c-模型(Model)和 数据存储(DataStore)

    2导入并配置JKM

    首先在项目中导入 JKM JKM Oracle Simple

    JKM 是为表生成并捕获日志的知识模块,需要在模型或表上面进行配置。

    编辑模型ODI_SRC的日记记录,选择简单日记记录模式,并选择 JKM Oracle Simple:

    clip_image001

    3启用 CDC

    ODI 提供简易的界面来启用 CDC,包括下面的步骤:添加到 CDC, 订阅 CDC,启动日记。

    首先右键模型ODI_SRC(或者右键数据存储EMP)→已更改数据捕获→添加到CDC

    clip_image002

    点击刷新按钮可以看到模型ODI_SRC中的表的图表发生了变化,出现了黄色的小时钟:

    clip_image003

    如果没有黄色的小时钟表,可以在工具→首选项勾选上在树中显示CDC内容clip_image004

    接下来从模型ODI_SRC的弹出菜单中选择启动日记(也可以对某一张表启动日记):

    clip_image005

    对于简单 CDC,启动日记的时候可以输入订阅的用户名。在弹出的窗口中录入订阅的用户名,如 Simple,点击添加订户:clip_image006

    点击确定完成:

    clip_image006[1]

    这将会启动一个会话,

    clip_image007

    请在 Operator 中查看会话是否成功完成。这个会话会在数据库中创建一些对象:CDC 的数据字典表(SNP开头),日记表和视图(通常是J$JV$开头),trigger(通常以T$开头)。

    clip_image008

    可以发现EMP表,DEPT表上多了触发器,内容分别如下

    触发器T$EMP(如果你只在表Dept上而不是模型上启动了日志,这没有这个)

    create or replace trigger ODI_SRC_WORK.T$EMP
      after insert or update or delete on ODI_SRC.EMP
      for each row
    declare
      V_FLAG  VARCHAR(1);
      V_EMPNO NUMBER(4);
    begin
      if inserting then
        V_EMPNO := :new.EMPNO;
        V_FLAG  := 'I';
      end if;
      if updating then
        V_EMPNO := :new.EMPNO;
        V_FLAG  := 'I';
      end if;
      if deleting then
        V_EMPNO := :old.EMPNO;
        V_FLAG  := 'D';
      end if;
      insert into ODI_SRC_WORK.J$EMP
        (JRN_SUBSCRIBER, JRN_CONSUMED, JRN_FLAG, JRN_DATE, EMPNO)
        select JRN_SUBSCRIBER, '0', V_FLAG, sysdate, V_EMPNO
          from ODI_SRC_WORK.SNP_SUBSCRIBERS
         where JRN_TNAME = 'ODI_SRC.EMP'
        /* The following line can be uncommented for symetric replication */
        /* and upper(USER) <> upper('ODI_SRC') */
        ;
    end;

    触发器T$DEPT

    create or replace trigger ODI_SRC_WORK.T$DEPT
      after insert or update or delete on ODI_SRC.DEPT
      for each row
    declare
      V_FLAG   VARCHAR(1);
      V_DEPTNO NUMBER(2);
    begin
      if inserting then
        V_DEPTNO := :new.DEPTNO;
        V_FLAG   := 'I';
      end if;
      if updating then
        V_DEPTNO := :new.DEPTNO;
        V_FLAG   := 'I';
      end if;
      if deleting then
        V_DEPTNO := :old.DEPTNO;
        V_FLAG   := 'D';
      end if;
      insert into ODI_SRC_WORK.J$DEPT
        (JRN_SUBSCRIBER, JRN_CONSUMED, JRN_FLAG, JRN_DATE, DEPTNO)
        select JRN_SUBSCRIBER, '0', V_FLAG, sysdate, V_DEPTNO
          from ODI_SRC_WORK.SNP_SUBSCRIBERS
         where JRN_TNAME = 'ODI_SRC.DEPT'
        /* The following line can be uncommented for symetric replication */
        /* and upper(USER) <> upper('ODI_SRC') */
        ;
    end;

    4测试是否能够捕获变化

    往 DEPT 中插入一行数据数据。

    insert into odi_src.dept (deptno, dname, loc) values ('60', 'assitant', 'boston');

    然后查询日记表:

    select * from odi_src_work.j$dept;

    clip_image009

    我们可以看到变化被捕捉到了日记表。

    这时我们也可以在 ODI 中查看日记数据:

    clip_image010

    5创建接口将变化数据同步到目标

    在项目ODI_Exercise中创建接口 Simple_CDC_Dept

    clip_image011

    在关系图中将 ODI_SRC 中的 EMP 添加到源,将 ODI_TRG中的 EMP 添加到目标数据存储,并自动映射。

    然后选中源数据存储,选中“仅以进行日记记录的数据”,

    clip_image011[1]

    指定日志过滤器,过滤器的内容是针对订户的,下面的例子表示当前接口将消费’Simple订户的数据:clip_image012

    其他的和一般的映射相同

    然后配置好 LKM(使用LKM SQL TO Oracle),IKM(使用 Oracle Increamental Update),和 CKM。

    clip_image013 clip_image014

    6执行 CDC 接口

    执行Simple_CDC_Dept,并在 Operator 中查看结果,我们看到插入了一条记录。clip_image014[1]

    在模型中查看 ODI_TAG的 Dept 表的数据:

    clip_image015

    clip_image016

    我们可以看到变化的数据数据被同步过来了:

    查看源表DEPT的日记数据:

    clip_image017

    我们看到已经没有了变化数据:

    clip_image018

    这说明一旦 ODI 接口消费了一张表的变化数据,相应的订户的日记数据将被清空。这种方式非常简单,但是对于多张存在主外键引用关系的表的数据同步将会有可能造成数据不一致的情况。对于这种复杂的情况需要一致性 JKM。

    7创建包轮询变化数据

    变化数据随时都可能生成,因此需要不断的将新的变化同步过去。有两种方法可以完成这个任务。

         第一种办法可以通过计划实现。例如创建一个计划,每半个小时执行一次同步接口。这样可以每半个小时将变化数据同步到目标。

         第二种办法是在创建一个包,利用ODI 提供的 CDC 相关的工具轮询日记,一旦有了变化就调用同步接口。

    第一种办法要注意计划的重复间隔,要保证在重复调用之前,上一次调用已经完成,一般可以用于定期同步的需求。

    第二种办法则可以满足实时性较高的需求。

    首先创建一个包:Simple_CDC_Dept_Pkg

    在关系图中添加用于 CDC 的工具: OdiWaitForLogData。如图配置属性:

    clip_image019

    按上面的配置将每1秒钟轮询DEPT的日记表,直到发现1条变化记录。

    将映射Simple_CDC_Dept拖拽到包中clip_image020

    添加OdiSleep

    clip_image020[1]完成接口后调用 OdiSleep 等待1秒,然后继续轮询。

    执行包,我们发现这个包会一直在执行,并处于 OdiWaiteForLogData 这一步。用下面的 SQL 插入数据:

    往 DEPT 中插入一行数据数据。

    insert into odi_src.dept (deptno, dname, loc) values ('70', 'assitant', 'boston');

    从 Operater 中我们发现这个会话会完成一个循环,

    clip_image021

    clip_image021

    查询 ODI_TAG中的 DEPT 表,我们也可以发现数据已经同步过去。

    我们可以继续删除源表的数据,我们可以看到数据很快会被同步过去。clip_image022

    8清除日志

    删除运行的包

    删除日记

    image

    这个操作将启动一个会话,请在 Operator 中检查会话执行的结果。如果成功完成,请检查数据库,你应该可以看到 CDC 相关的对象:触发器和日记表和视图都被删除掉了。

    从CDC中删除

    image

    完成之后刷新,应该可以看到表的图标上面的小时钟消失了。模型上已进行日记记录的表为空

    image

  • 相关阅读:
    Swift
    iOS 拨打电话
    UI控件问题和XCode编译警告和错误解决方法集锦 (持续更新ing)
    让UIWebView弹出键盘上的按钮显示中文 (附效果图)
    启动app时全屏显示Default.png (附效果图)
    三种数据存储 (plist,NSUserDefaults存储,NSKeyedArchiver存模型方法)
    生成圆形头像 (附效果图)
    循环按钮,并且选中 (附效果图)
    leetcode 字符串分割对称
    leetcode merge-sorted-array/
  • 原文地址:https://www.cnblogs.com/chendian0/p/14338435.html
Copyright © 2020-2023  润新知