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:

3启用 CDC

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

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

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

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

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

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

点击确定完成:

这将会启动一个会话,

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

可以发现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;

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

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

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

在项目ODI_Exercise中创建接口 Simple_CDC_Dept

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

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

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

其他的和一般的映射相同

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

6执行 CDC 接口

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

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

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

查看源表DEPT的日记数据:

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

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

7创建包轮询变化数据

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

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

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

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

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

首先创建一个包:Simple_CDC_Dept_Pkg

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

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

将映射Simple_CDC_Dept拖拽到包中

添加OdiSleep

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

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

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

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

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

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

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

8清除日志

删除运行的包

删除日记

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

从CDC中删除

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

Oracle Data Integrator 12c----简单CDC(Simple CDC)的更多相关文章

  1. Oracle Data Integrator 12c 安装(ODI安装)

    Oracle Data Integrator 12c 安装(ODI安装) 企业版安装步骤(包含独立安装步骤) 官网下载Oracle Data Integrator 12cR2 (12.2.1.0.0) ...

  2. Oracle Data Integrator 12c (12.1.2)新特性

    改进特性如下: 基于流程界面的声明式设计 在12c中,以前的接口(interface)已经改为映射(mapping),新的基于流程声明的设计方式更灵活,也更容易使用.在12c中,映射的实现是通过使用J ...

  3. Manipulating Data from Oracle Object Storage to ADW with Oracle Data Integrator (ODI)

    0. Introduction and Prerequisites This article presents an overview on how to use Oracle Data Integr ...

  4. Oracle Data Integrator 12c----一致性 CDC(Consistent CDC)

    一致性 CDC 中引入了变化集的概念.一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表.CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性.这个练习介绍如何使用能够保证一致性 ...

  5. Oracle Goldengate和Oracle Data Integrator的初步认识

    免责声明:     本文中使用的部分图片来自于网络,如有侵权,请联系博主进行删除 1. Oracle Glodengate是什么? GoldenGate是oracle的一种基于数据库日志的数据同步软件 ...

  6. Oracle Data Integrator与OWB的集成及迁移

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  7. Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程

    Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程 下载安装文件 Oracle Data Integrator 12cR1 (12.1.3.0.0) http: ...

  8. Oracle Data Integrator 12c-第一个映射

    一.创建"项目" 设计器->项目,点击插入项目图标, 在项目对话框的"定义"标签下输入项目名称如ODI_Exercise ,保存 二.导入知识模块 项目→ ...

  9. oracle data integrator与大数据平台的集成

    在最新版本的ODI中,通过使用各种知识模块,可在统一的界面上实现对传统数据库.hive, pig, spark, hdfs等的ETL操作,满足在同一系统或采用相同的方式实现ETL功能. 详细的内容可参 ...

随机推荐

  1. mysql 内存表

    show variables like 'max_%'; max_heap_table_size 16777216     max_tmp_tables 32     show variables l ...

  2. 用jpinyin实现汉字转拼音功能

    一.简介 项目地址:https://github.com/stuxuhai/jpinyin JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进. [JPiny ...

  3. [Web 前端 ] ES6 == ES 2015

    cp from : https://www.cnblogs.com/ricoliu/p/5996149.html 遇到了一个困惑   原来称作es6的现在突然变成es2015 了 原因是这个事ecma ...

  4. [Network] okhttp3与旧版本okhttp的区别分析

    cp from : https://www.jianshu.com/p/4a8c94b239b4 1.包名改变 包名改了由之前的 com.squareup.http.改为 okhttp3. 我们需要将 ...

  5. Xilinx FFT IP v9.0 使用

    该ip用于实现N=2**m(m=3~16)点FFT的变换, 实现的数学类型包含: A)      定点全精度 B)      定点缩减位宽 C)      块浮点 每一级蝶型运算后舍入或者取整.对于N ...

  6. Java语言:JAVA8 十大新特性详解(zz)

    关键词: Lambda表达式.函数式接口.方法与构造函数引用.接口的默认方法 原文地址: http://www.jb51.net/article/48304.htm 本教程将Java8的新特新逐一列出 ...

  7. sharding-jdbc之——分库分表实例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79368021 一.概述 之前,我们介绍了利用Mycat进行分库分表操作,Mycat ...

  8. JAVA的Split小技巧

    在日常的开发中截取字符串必不可少,但是在JAVA中的Split截取有点特点的地方是         例如:            String str=1,2,3,; 那么  str.split(&q ...

  9. TensorFlow实战12:Bidirectional LSTM Classifier

    https://blog.csdn.net/felaim/article/details/70300362 1.双向递归神经网络简介 双向递归神经网络(Bidirectional Recurrent ...

  10. 在UTF-8中,一个汉字为什么需要三个字节?(转)

    http://www.cnblogs.com/web21/p/6092414.html UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序.有关Unicod ...