一致性 CDC 中引入了变化集的概念。一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表。CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性。这个练习介绍如何使用能够保证一致性的CDC。
1 环境准备
源表:ODI_SRC.DEPT,ODI_SRC.EMP
目标表:ODI_TAG.DEPT, ODI_TAG.EMP
配置拓扑结构见ODI Studio拓扑结构的创建与配置(Oracle)
模型反向工程见:Oracle Data Integrator 12c-模型(Model)和 数据存储(DataStore)
2导入并配置JKM
首先在项目中导入 JKM JKM Oracle Consistent
JKM 是为表生成并捕获日志的知识模块,需要在模型或表上面进行配置。
编辑模型ODI_SRC的日记记录,选择简单日记记录模式,并选择 JKM Oracle Consistent:
3启用 CDC 日记
一致性 CDC 同简单 CDC 在实现方式和功能上都有不同,但是在使用上大致相同。这里还是包含了这几步:添加到 CDC, 订阅 CDC,启动日记。
首先右键模型ODI_SRC→已更改数据捕获→添加到CDC
查看
右键模型ODI_SRC→已更改数据捕获→订户→订阅
在弹出窗口种输入订阅用户,如Consistent,然后添加
点击确定完成订阅。这会启动一个会话。请在 Operator 中检查会话完成情况。
接下启动日记:右键模型ODI_SRC→已更改数据捕获→启动日记
这个操作也会执行一个会话,该会话执行完之后也将会生成一些 CDC 专用的数据库对象。生成的内容同简单 CDC 类似。
4测试是否能够捕获变化
往 DEPT 中插入一行数据数据。
INSERT INTO ODI_SRC.DEPT (DEPTNO, DNAME, LOC) VALUES ('', 'Assitant', 'BOSTON');
查看日记数据
继续插入数据
insert into odi_src.emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values ('', 'miller', 'clerk', '', sysdate, '', null, '');
查看日记数据
然后查询日记表:
SELECT * FROM "ODI_SRC_WORK"."JV$DDEPT";
SELECT * FROM "ODI_SRC_WORK"."JV$DEMP";
可以查询到数据
但是,如果你执行下面的 SQL 查询
SELECT * FROM "ODI_SRC_WORK"."JV$DEPT";
SELECT * FROM "ODI_SRC_WORK"."JV$EMP";
你会发现查询不到内容。这是因为一致性 CDC 提供了按窗口扩展,按用户锁定并访问日记数据的机制。我们需要这种机制来保证在捕获和发布变化数据的时候不违反一致性。
Designer 提供了界面来扩展窗口和锁定订户。
首先从模型 ODI_SRC 的右键弹出菜单中选择扩展窗口:
然后从模型 ODI_SRC 的右键弹出菜单中选择锁定订户:
在弹出的窗口中选择并添加要锁定的订户,然后确定完成锁定:
这两个步骤都会提交一个会话。在 Operator 中查看会话执行情况。然后再查询视图
我们会发现视图中能看到变化数据了。
SELECT * FROM "ODI_SRC_WORK"."JV$DEPT";
SELECT * FROM "ODI_SRC_WORK"."JV$EMP";
5创建接口将变化数据同步到目标
在项目ODI_Exercise中创建接口Consistent_CDC_Dept 和 Consistent_CDC_Emp,这里以Consistent_CDC_Dept 表为例
在关系图中将 ODI_SRC 中的 EMP 添加到源,将 ODI_TRG中的 EMP 添加到目标数据存储,并自动映射。
然后选中源数据存储,选中“仅以进行日记记录的数据”,
指定日志过滤器,过滤器的内容是针对订户的,下面的例子表示当前接口将消费Consistent订户的数据:
其他的和一般的映射相同
然后配置好 LKM(使用LKM SQL TO Oracle),IKM(使用 Oracle Increamental Update),和 CKM。
然后执行两个接口。我们看到变化数据被同步到了ODI_TAG中的DEPT和EMP表中。
但是我们会发现日记数据还在。也就是说对于使用了一致性设置的 CDC,接口同步完数据之后并不会自动清除日记。
我们需要执行另外两个操作来清除已经消费了的日记数据:解除锁定和清除日记。Designer 也提供了执行这两个操作的界面。
6创建一个包完成一个变化集的数据同步
一致性 CDC 会为一个模型创建一个变化集,变化集的名称同模型的名称相同。在ODI_SRC 变化集中包含了2张表:DEPT, EMP。
然后创建一个包CDC_Consistent_Pkg。在关系图中将模型ODI_SRC拖进来。指定类型为日记记录模型,选上扩展窗口和锁定订户,并且添加订户 Consistent:
然后将 Consistent_CDC_Dept 和 Consistent_CDC_Emp拖进来。在最后再将模型 ODI_SRC 拖进来,指定类型为日记记录模型,选上清除日记和取消订户锁定,并且添加订户 Consistent:
7循环执行
在上面的第一个日记记录模型ODI_SRC后面添加OdiWaitForLogData
CDC集的名字可以通过下面的SQL查询
SELECT * FROM "ODI_SRC_WORK"."SNP_CDC_SET";
在上面的第2个日记记录模型ODI_SRC后面添加OdiSleep
设置第一步为第一个模型ODI_SRC