oracle的CDC和物化视图对比,Oracle Data Integrator 12c----简单CDC(Simple CDC)

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

1 环境准备

源表:ODI_SRC.DEPT

目标表:ODI_TAG.DEPT

2导入并配置JKM

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

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

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

f278016de4ede7c61875512dc81c1320.png

3启用 CDC

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

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

5a14a7de84c19de11188855a9416dac2.png

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

04156f6314ea320457c801950706934a.png

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

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

a23298eb030597a07ab752ba1f144e7e.png

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

点击确定完成:

7f83e122d038092b69bdbf592f6b1d68.png

这将会启动一个会话,

8b34ee717a67499c1071e9a76d9caa41.png

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

3ec864b0f4ef9d35d783d70df96ddda3.png

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

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

db6cd26370ffe7f274c9052ae37a7d18.gif

277d5c1022cdcd9d9e844c6a549f3f9a.gif

create or replace triggerODI_SRC_WORK.T$EMP

afterinsert or update or delete onODI_SRC.EMPforeach rowdeclareV_FLAGVARCHAR(1);

V_EMPNONUMBER(4);begin

if inserting thenV_EMPNO :=:new.EMPNO;

V_FLAG := 'I';end if;if updating thenV_EMPNO :=:new.EMPNO;

V_FLAG := 'I';end if;if deleting thenV_EMPNO :=:old.EMPNO;

V_FLAG := 'D';end if;insert intoODI_SRC_WORK.J$EMP

(

JRN_SUBSCRIBER,

JRN_CONSUMED,

JRN_FLAG,

JRN_DATE,

EMPNO

)selectJRN_SUBSCRIBER,'0',

V_FLAG,

sysdate,

V_EMPNOfromODI_SRC_WORK.SNP_SUBSCRIBERSwhere JRN_TNAME = 'ODI_SRC.EMP'

/*The following line can be uncommented for symetric replication*/

/*and upper(USER) <> upper('ODI_SRC')*/;end;

View Code

触发器T$DEPT

db6cd26370ffe7f274c9052ae37a7d18.gif

277d5c1022cdcd9d9e844c6a549f3f9a.gif

create or replace triggerODI_SRC_WORK.T$DEPT

afterinsert or update or delete onODI_SRC.DEPTforeach rowdeclareV_FLAGVARCHAR(1);

V_DEPTNONUMBER(2);begin

if inserting thenV_DEPTNO :=:new.DEPTNO;

V_FLAG := 'I';end if;if updating thenV_DEPTNO :=:new.DEPTNO;

V_FLAG := 'I';end if;if deleting thenV_DEPTNO :=:old.DEPTNO;

V_FLAG := 'D';end if;insert intoODI_SRC_WORK.J$DEPT

(

JRN_SUBSCRIBER,

JRN_CONSUMED,

JRN_FLAG,

JRN_DATE,

DEPTNO

)selectJRN_SUBSCRIBER,'0',

V_FLAG,

sysdate,

V_DEPTNOfromODI_SRC_WORK.SNP_SUBSCRIBERSwhere JRN_TNAME = 'ODI_SRC.DEPT'

/*The following line can be uncommented for symetric replication*/

/*and upper(USER) <> upper('ODI_SRC')*/;end;

View Code

4测试是否能够捕获变化

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

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

然后查询日记表:

select * from odi_src_work.j$dept;

10f1e5f02f7acc72f9060f1e446a84b9.png

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

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

39b45e7950f75594618fc92c151fe9e2.png

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

在项目ODI_Exercise中创建接口 Simple_CDC_Dept

bf275d3f4827bf8e1c59bc8d1fb9e2a3.png

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

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

d5b1c8c1459fb8a7d48b4de3d2a46711.png

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

其他的和一般的映射相同

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

5f71f55adaf966e17ade55af1a1adc11.png5a6ddb89218f1cc0b1f1e242e0b756d7.png

6执行 CDC 接口

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

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

c782bd82c54dfc10a6dc624214fac7de.png

7e161680feaae4e8c908f2bdef3f3d98.png

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

查看源表DEPT的日记数据:

6e3c849e84d0c51cc34ed4a733f4f1cb.png

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

9bb10c79c99e6f6274c34e7bdc632387.png

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

7创建包轮询变化数据

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

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

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

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

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

首先创建一个包:Simple_CDC_Dept_Pkg

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

df99e41913746bf6bb109771e6088f6c.png

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

将映射Simple_CDC_Dept拖拽到包中b49cfd4547309782fbf45dc546094828.png

添加OdiSleep

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

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

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

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

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

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

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

8清除日志

删除运行的包

删除日记

6ef88949d0e068f60fa244cd76616b3d.png

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

从CDC中删除

587b6a73c417448650052a537db92486.png

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

932b46243e7e90a0bf0fb0c8ce702757.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值