ODI配置使用日志记录streams实现表同步

来源:互联网 发布:人工神经网络算法实例 编辑:程序博客网 时间:2024/04/29 22:01

一、配置数据库

1、修改需要发布表的数据库服务器系统变量

由于在ODI的操作中会帮我们设置数据库的参数(如java_pool、streams_pool_size)这里只需要设置补充和强制记录模式,实际在操作流程中ODI会帮我们设置特定表的日志模式,不过为了保险还有对更多表的操作有效,还是自己设置一下。

查看归档日志模式

archive log list

修改归档日志模式

alter database force logging;

alter database add supplemental log data;

2、给需要发布表的用户增加权限

需要赋予的权限有:connect\resource\create view\create database link\create synonym\createsession\create table\create sequence\create procedure\ dba\execute_catalog_role\select_catalog_role\execute ondbms_cdc_publish\execute on dbms_lock\unlimited tablespace\begin dbms_streams_auth.grant_admin_privilege('SCOTT1_NEW1'); end;\table_name(这里是需要赋予发布者要发布的表名的权限)\

3、给需要订阅表的用户增加权限

create user scott2 identified by tiger2default tablespace users;

grant connect,resource to scott2;

grant create database link to scott2;

grant create synonym to scott2;

//另外需要创建一个表结构与发布者的表结构相同的表

二、配置ODI

1、创建主资料库,并连接。(执行后可以看到除设计器以外的所有模块)

2、创建工作资料库,并连接。(执行后可以看到设计器模块)

创建工作资料库后并连接才有设计器(工作资料库是保存项目和数据模型的)

3、配置拓扑中的物理结构和逻辑结构

坑1:用户名大小写(原因:oracle对大小写敏感)

如果这里的用户名使用的小写,后面的odi自动生成的语句中,调用该用户名时就会加上“”,会出现一些问题。

坑2:把数据库A的数据导入到数据库B的相同结构表时,需要建立DBLINK,且需要配置其名字,否则会出现同义词无效,实际为在库B找不到库A的视图导致。(原因:库A和库B的物理结构中需要配置dblink名,不能使用类似orcl关键字。)

物理结构中主要配置物理结构中的{定义}{JDBC}两个页面


逻辑结构中主要配置{定义}和{上下文}两个页面


Ps:scott1是源数据库,scott2是目标数据库(这里我使用的是本机)

三、配置设计器

1、创建项目并导入知识模型

这里只需要配置一个页面


展开Designer=>知识模型,右键导入知识模型,把需要使用的知识模型导入到该项目中,这里我们使用的分别是:RKM Oracle、LKM Oracle to Oracle、CKM Oracle、IKM Oracle Incremental Update、JKM Oracle 11g Consistent (Streams)(由于我们使用的是流实现同步,所以使用该知识模块)、SKM(这里我没有使用,等以后的项目中需要再视情况导入)。

2、创建模型

新建两个模型,分别对应源数据库和目标数据库


模型的配置中主要配置{定义}{选择性逆向工程}{控制}{日记记录}四个页面


这里的逻辑方案使用的是我们前面配置的逻辑方案,注意大小写。


(这个页面的配置放在最后面,在各个页面配置好保存后,再进入该页面,然后打上如图中三个勾就会显示需要逆向工程导入到ODI的表,选择需要导入的表,即需要进行数据同步操作的表,配置好后点击左上角的逆向工程,会将需要的表导入到ODI中,如果导入失败,说明前面的物理配置或者逻辑配置是有问题的)


(这里使用我们前面导入的CKM)


(这里使用我们前面导入的JKM)

3、开启CDC日志记录

由于源表(这里我使用的scott1的EMP)在映射前必须要设置主键,所以我们先给它设置主键,对应表的主键。

展开scott1=>EMP=>约束条件,右键=>新建关键字,给关键字命名,然后在{列}中选择表中对应的主键,ctrl+s保存。Scott2=>EMP同。

右键点击源数据库中的源表,添加到CDC


添加成功后,在scott1的{已进行日志记录的表}中可以看到EMP


3、设置订阅表

展开scott2=>EMP右键=>已更改数据捕获=>订户=>订阅


输入订阅名,添加,这里的订阅会在后面的日志记录中用到,日志记录后查看日志记录中会有不同订户名的多条记录,如插入一条数据会显示多个订户的多个插入数据的记录。


4、创建接口

新建接口,选择Oracle:scott2.SCOTT2(目标数据库)


将左边的源表和目标表分别拖入映射区域,左边的区域是数据源,右边的区域是目标源。

即:源表拖入左边,目标表拖入右边,选择自动映射。



点击源表EMP,勾选仅已进行日记记录的数据,这里是在设置筛选器。


然后出现了一个筛选器的图片,点击后设置如下(这里的test2是前面的订户名):


进入流,设置映射过程中的各个知识模块。



保存,接口创建成功。

 

四、测试执行

1、测试连接数据库是否成功(在前面的)物理结构中配置{jdbc}后左上有测试连接。

2、测试逆向工程能否成功导入表(在前面的)模型中点击逆向工程后,能否看到有表出现在模型(scott1或scott2)下。

3、测试日志能否正常记录

开启CDC后,右键该发布表。


启动日志后,查看


启动成功后,在源数据库中增删改数据commit后,在查看日记记录。


正常情况下,日志记录中会有不同订户的相同的各个操作记录。(在同步模式下记录日志后显示正常)

Ps:我的问题就是出现在这里,前面的执行过程都是成功的,但是在这里找不到日志记录。

推测:

(1)    可能是该数据库中测试数据等执行过很多不同的指令,导致了在某个环节出现问题。

(2)    执行过程中没有报错,说明sql语句都是成功执行了,那么原因有可能如下:

1) ODI无法检测出某些sql报错,比如当sql语句无效时直接跳过。

2) Sql全部正常运行,但是在日志记录的过程中出现问题,或者日志记录后文件无法保存。

3) ODI无法正常解析Oracle生成日志文件

尝试方案:

1.    测试换个用户、换个数据库重新配置执行。

2.    1)把ODI中生成的语句在Oracle中按流程测试执行

2)在源数据库中查找日志记录表

3)在源数据库中查找日志文件

 

查看各个步骤的源代码时发现问题发生在源库的SNP_CDC_SET中缺失改变集。

于是我试图直接在表SNP_CDC_SET中插入一条名为改变集为SCOTT1.SCOTT1、订阅者为test2的数据。


重新启动日志并测试数据,发现日志数据能成功导出。

错误原因还没有找到,偶然通过这种方式解决了我目前的问题。

目前推测为:我在之前的测试中尝试移除过一些表数据,导致了移除掉步骤中重要的表(SNP_CDC_SUBS)的数据

4、测试接口过程能否成功执行

日志记录能正常记录后,测试能否映射成功,右键点击接口=>执行。

查看操作记录,能否正常运行。如果运行正常,在目标数据库中的表下能看到已更新到与源库一致,同步后,日志记录也会被清空。

注意:数据同步方案执行成功完成后还有延迟才能查阅到同步的数据。(但此时日志文件已经被处理,即日志文件数据为空,同步还未完成)

原创粉丝点击