Oracle Data Integrator 12c----简单CDC(Simple CDC)
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)的更多相关文章
- Oracle Data Integrator 12c 安装(ODI安装)
Oracle Data Integrator 12c 安装(ODI安装) 企业版安装步骤(包含独立安装步骤) 官网下载Oracle Data Integrator 12cR2 (12.2.1.0.0) ...
- Oracle Data Integrator 12c (12.1.2)新特性
改进特性如下: 基于流程界面的声明式设计 在12c中,以前的接口(interface)已经改为映射(mapping),新的基于流程声明的设计方式更灵活,也更容易使用.在12c中,映射的实现是通过使用J ...
- 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 ...
- Oracle Data Integrator 12c----一致性 CDC(Consistent CDC)
一致性 CDC 中引入了变化集的概念.一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表.CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性.这个练习介绍如何使用能够保证一致性 ...
- Oracle Goldengate和Oracle Data Integrator的初步认识
免责声明: 本文中使用的部分图片来自于网络,如有侵权,请联系博主进行删除 1. Oracle Glodengate是什么? GoldenGate是oracle的一种基于数据库日志的数据同步软件 ...
- Oracle Data Integrator与OWB的集成及迁移
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- 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: ...
- Oracle Data Integrator 12c-第一个映射
一.创建"项目" 设计器->项目,点击插入项目图标, 在项目对话框的"定义"标签下输入项目名称如ODI_Exercise ,保存 二.导入知识模块 项目→ ...
- oracle data integrator与大数据平台的集成
在最新版本的ODI中,通过使用各种知识模块,可在统一的界面上实现对传统数据库.hive, pig, spark, hdfs等的ETL操作,满足在同一系统或采用相同的方式实现ETL功能. 详细的内容可参 ...
随机推荐
- Java并发编程的艺术(二)——重排序
当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此. 什么是重排序? 重排序指的是编译器.处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率. 重 ...
- html效果增强
1:提示框 http://keleyi.com/keleyi/phtml/jqplug/ 2:loading效果 <script>function showPage(){ $('#d ...
- Orchard模块开发全接触7:订单与支付之Event Bus
在这部分,我们要完成的工作有: 1:将购物车内的商品变成真正的订单: 2:理解 父子及一对多关系: 3:写一个针对 Event Bus 的扩展点: 4:实现一个针对该扩展点的模拟的 支付服务: 一:创 ...
- Orchard模块开发全接触4:深度改造前台
这里,我们需要做一些事情,这些事情意味着深度改造前台: 1:为商品增加 添加到购物车 按钮,点击后功能实现: 2:商品排序: 3:购物车预览,以及添加 结算 按钮: 4:一个显式 购物车中有*个 商品 ...
- anaconda、pip配置国内镜像
一.anaconda配置镜像查看源:conda config --show-sources在Mac and Linux下:conda config --add channels https://mir ...
- Svg.js 图片加载
一.SVG.Image 1.创建和修改图片 var draw = SVG('svg1').size(300, 300); //SVG.Image 加载图片文件 var image = draw.ima ...
- Netty 4.0.0.CR6 发布,高性能网络服务框架
Netty 4.0 发布第 6 个 RC 版本,该版本值得关注的改进有: SslHandler and JZlibEncoder now works correctly. (#1475 and #14 ...
- codevs 2190 有理逼近
2190 有理逼近 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 对于一个素数P,我们可以用一系列有理分数(分子.分母都是 ...
- 【VC++积累】之八、PreTranslageMessage;TranslageMessage;GetMessage和PeekMessage的区别
先来看windows消息机制: 首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息 放到一个系统消息队列中去. 而应用程序需要有自己的消息队列,也就是线程消息队列,每一 ...
- SD内存卡禁止写入只读怎么办?另类SPI模式修复坏卡
这几天很郁闷,买的32G TF卡老出问题,三星的标,不知道是不是正品,标称C10,且不说是不是真的三星和真的C10,反正测试一下容量倒是真的,价格么也比较亲民,好像是69块? 哎,可惜呀,好景不长 ...