ODI基本操作
[TOC]
概述
ODI(Oracle Data Integrator)是Oracle在2006年10月收购Sunopsis公司后,整合Sunopsis Active Integration Platform而推出的一款数据集成工具,现在是Oracle Fusion Middleware的组件。无论是 ETL 还是 E-LT,其基本目标是通过 Extract/Transformation/Load 这几个过程达到将源数据整合并放入目标数据库/数据仓库的过程。ETL 的基本思路是通过独立开发的转换引擎,将源数据抽取,在转换引擎中完成转换整合的过程,最终将数据载入到目标数据库或数据仓库。而E-LT的基本思路是充分运用源与数据RDBMS(关系型数据库)达成转换的目标,即运用RDBMS厂商提供的功能及SQL 语句完成转换,而非在自己开发的转换引擎中完成转换的过程,类似于通过手工编程的方式完成ETL。E-LT的转换不仅发生在目的端,同样发生在源数据端。它的原则就是在转换效率最高的一端完成数据转换。
- Oracle Data Integrator 架构
racle Data Integrator 统合在一个模块化的数据仓库下,并可用基于 Java 编写的图形化开发 管理工具以及计划代理程序进行访问。
DI 的数据仓库包括一个主仓库(Master Repository),用于保存用户及角色信息,连接其他数据库或数据源,不同版本的项目。一个主仓库包含一个或多个工作仓库(WorkRepository),包含具体的数据以及在用户与整合数据间建立关联。数据仓库可以建立在Oracle 数据库或其它数据库上,并可通过开发工具进行管理以及通过计划代理程序进行访问。
- ODI 提供了以下几种管理工具:
1)Designer 用于定义数据转换逻辑,这是最常用的开发工具,大部分的开发任务,包括data store 的定义,interface(数据映射关系)和 package(相当于 workflow)的创建等,都是在 Designer 中完成。
2)Operator 用于管理和监控数据转换任务的执行情况,在设计阶段,也可用于调试(debugging)
3)Topology Manager 用于定义物理和逻辑基础架构,如 work repository 的创建和管理等。
4)Security Manager 用于管理用户权限 以及一个计划代理程序:
5)Schedule Agent 计划代理,用于调度执行数据转换任务。计划代理同时也带有一个数据转换引擎,但是ODI 采用 E-LT 架构,所以基本上计划代理只是将任务传递给目标库,其数据转换引擎很少用到。
- Knowledge Modules [知识模型]
racle Data Integrator 之所以能适应不同的、多种多样的数据源,灵活有效的完成数据抽取/
转换/载入的过程,均是基于其知识模型体系。
nowledge Modules 类似于程序中的插件,Oracle Data Integrator 将数据整合的任务抽象出 六个组成部分
1)[反向工程]Reverse-engineering knowledge modules:用于从数据源读取表及其他对 象。
2)[日记]Journalizing knowledge modules:用于为单一或一组表/视图记录新建的和修改的数据。ODI 支持部分数据源的 Change Data Capture(CDC)功能,前提为ODI项目中启用该模块。
3)[加载]Loading knowledge modules:用于从数据源抽取数据。
4)[检查]Check knowledge modules:用于检测抽取出的源数据的合法性。
5)[集成]Integration knowledge modules:用于将 Staging Area 中的数据转换至目标表, 基于目标数据库产生对应的转换 SQL。
6)[服务]Service knowledge modules:提供将数据以 Web Services 的方式展现的功能。
1.基本准备工作
- 1.1 安装ODI12C
确保本机java版本1.8及以上
进入本机java的目录bin下执行java -jar 路径fmw_12.2.1.0.0_odi.jar
一路点击NEXT,选择独立安装 - 1.2 连进工作空间
- 1.3新建数据服务器
在拓扑中右键Oracle,选择新建数据服务器
输入名称和数据库实例(数据库的SERVICE_NAME),用户名和密码
在JDBC中输入JDBC驱动(一般是oracle.jdbc.OracleDriver)和JDBC地址,使用私有同义词时,会出现同义词同步到,但没有字段的情况,需要在要反向的数据服务器上添加属性:key = includeSynonyms value = true,然后再同步,可能会造成反向速度特别慢(原因待确认,测试环境没有这个问题)
点击左上角测试连接,在第一个弹出框中选择本地(无代理),点击测试,弹出成功连接即为成功。
- 1.4 新建物理方案
右键新建的数据服务器,选择新建物理方案
在方案(方案)下拉框内选择数据源所在的用户,在方案(工作方案中选择要导入的目的用户)
点击保存,会弹出如下弹出框
- 1.5 新建逻辑方案
在逻辑体系结构中右键Oracle,选择新建逻辑方案
输入逻辑方案名称,在物理方案中选择刚才新建的物理方案,点击保存
- 1.6 新建模型
逻辑方案创建好后,在设计器中,选择新建模型
一共新建以下四个模型文件夹
右键文件,点击新模型,创建新模型
技术选择Oracle,逻辑方案选择刚才建的FUSION_DEV,点击保存
打开刚才建好的模型,选择逆向工程,在“要进行逆向工程的对象的类型”中,选择表,则只能根据掩码中的内容同步表,选择表和视图,则可以同步表和视图,公共同义词无法同步,原因是(由Oracle数据集成器(ODI)管理的所有数据库对象(表、视图、同义词、过程、函数、触发器、索引…)都应以数据库架构名称作为前缀。由于公共同义词前面没有任何模式名称,因此不能使用标准反向工程模式由ODI对其进行反向工程),要解决这种情况可以直接授予用户对公共同义词引用的对象的访问权限,或使用简单/私有同义词而不是公共同义词。
使用私有同义词时,会出现同义词同步到,但没有字段的情况,需要在数据服务器上添加属性:key = includeSynonyms value = true,然后再同步,可能会造成反向速度特别慢
反向完成后如下,对同义词进行反向有可能不带主键,需要右键约束条件添加
1.7各种同步方式比较
模型文件夹 | 同步类型 | 适用范围 | 其他要求 |
---|---|---|---|
DemoTestSync | 同步 | 数据量不大的单表/视图 | 允许全部删除数据,再插入新数据 |
DemoTestSimple | 简单CDC同步 | 适用于单表同步,每一张 CDC 的表的变化都是独立捕获的,不需要考虑多张存在主外键引用关系的表之间的数据一致性 | 允许在表上创建Update/Insert/Delete的Trigger造成的数据库性能损耗 |
DemoTestTrigger | 一致性CDC同步 | 适用于多个有关联的表同步,一致性 CDC 中引入了变化集的概念。一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表,CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性 | 允许在表上创建Update/Insert/Delete的Trigger造成的数据库性能损耗 |
DemoTestCDCUpdateDate | 一致性CDC同步(基于上次更新时间) | 适用于多个有关联的表同步,一致性CDC同步的升级版,在保证数据一致性的基础上减少了对数据库性能的损耗,但要求更高 | 允许在表上创建Delete的Trigger造成的数据库性能损耗,保证表的字段中必须有随任何更改而更改的lastupdatedate字段(date或timestamp类型),相应SCHEMA也要有DBA和创建文件权限 |
2.简单同步数据
在项目中右键映射,创建DemoTestSync
将源表和目标表拖到映射中,并连线
如果需要操作字段,可以目标表中选择表达式编辑
如果源表和目标表在一个Schema下,点击物理显示如下
如需在插入数据前清除老数据,可以点击目标表,选择TRUNCATE_TARGET_TABLE或DELETE_ALL为真,TRUNCATE_TARGET_TABLE无法对同义词生效
如果源表和目标表不在一个Schema下,点击物理显示如下
点击连接组件,选择加载知识模块为LKM SQL to Oracle
映射编辑完成后,点击执行,在数据库中查看是否成功
一次同步数据结束
在操作器中的所有执行的操作
步骤页里是操作的所有步骤,双击打开详情可以查看具体操作的sql
3.简单CDC模式同步数据
修改模型的知识模块为JKM Oracle Simple模式并反向数据
源表添加CDC
模型添加订阅
输入订阅者,点击确定,订阅者可以自己定义
源表开启日记
开启时选择刚才创建的订户
开启日记后,会在数据库中生成以下一张表,两张视图,如果没有则日记开启不成功,需要检查过程
select * from j$odi_test_simple_source_synon;
select * from jv$dodi_test_simple_source_syn;
select * from jv$odi_test_simple_source_syno;
向odi_test_simple_source_synonym中插入两条数据,会发现j$odi_test_simple_source_synon中也插入两条数据
将源表和目标表拖到映射中,并连线
选择源表,修改日记记录数据过滤器,修改订户为刚才的订阅者Zero
修改目标表的集成类型为增量更新
在物理中,勾选仅已进行日记记录的数据
点击连接组件,选择加载知识模块为LKM SQL to Oracle
修改IKM集成知识模块为IKM Oracle Increamental Update
映射编辑完成后,点击执行,在数据库中查看是否成功
数据插入成功
一次简单CDC模式同步数据结束
4.一致性CDC模式同步数据
修改模型的知识模块为JKM Oracle Consistent并反向数据
以下步骤和简单CDC一样
:源表添加CDC
:模型添加订阅
:输入订阅者,点击确定,订阅者可以自己定义
:源表开启日记
:将源表和目标表拖到映射中,并连线
:选择源表,修改日记记录数据过滤器,修改订户为刚才的订阅者Zero
:修改目标表的集成类型为增量更新
:在物理中,勾选仅已进行日记记录的数据
:点击连接组件,选择加载知识模块为LKM SQL to Oracle
:修改IKM集成知识模块为IKM Oracle Increamental Update
开启日记后,会在数据库中生成以下一张表,两张视图,如果没有则日记开启不成功,需要检查过程
SELECT * FROM J$ODI_TEST_T_SOURCE_SYNONYM;
SELECT * FROM JV$DODI_TEST_T_SOURCE_SYNONYM;
SELECT * FROM JV$ODI_TEST_T_SOURCE_SYNONYM;
但检查表结构就会发现J$ODI_TEST_T_SOURCE_SYNONYM的结构和简单CDC不一样
J$ODI_TEST_T_SOURCE_SYNONYM只有两个字段,而且插入数据后字段WINDOW_ID是空的
这是因为一致性 CDC 提供了按窗口扩展,按用户锁定并访问日记数据的机制,需要这种机制来保证在捕获和发布变化数据的时候不违反一致性
想要看到数据需要额外如下操作:
扩展窗口
扩展窗口后,可以查询数据
锁定订户
开启时选择刚才创建的订户
映射编辑完成后,点击执行,在数据库中查看是否成功
数据插入成功
数据同步完成后
清除日记
取消锁定用户
一次一致性CDC模式同步数据结束
##5.一致性CDC(Last Update Date)同步数据
修改模型的知识模块为JKM Oracle Consistent(Update Date)并反向数据
修改UPDATE_DATE_COL_NAME为表中的LAST_UPDATED_DATE,必须保证有任何数据更新时LAST_UPDATED_DATE会随之更新
VALIDATE选择真/true
其余操作和一致性CDC一样
:源表添加CDC
:模型添加订阅
:输入订阅者,点击确定,订阅者可以自己定义
:源表开启日记
:将源表和目标表拖到映射中,并连线
:选择源表,修改日记记录数据过滤器,修改订户为刚才的订阅者Zero
:修改目标表的集成类型为增量更新
:在物理中,勾选仅已进行日记记录的数据
:点击连接组件,选择加载知识模块为LKM SQL to Oracle
:修改IKM集成知识模块为IKM Oracle Increamental Update
:扩展窗口
:锁定订户
:映射编辑完成后,点击执行,在数据库中查看是否成功
:数据插入成功
:取消锁定用户
:清除日记
6.在ODI中做查询
在组件中拖出LookUp,Filter或Join组件进行查询
LookUp 两个表或视图关联查询使用
Filter 单表或视图过滤
Join 两个表或视图外关联,下图为包含LOOKUP所有行
目标表的字段值
7.程序包
映射建好后,需要根据实际情况进行调用,右键程序包
向程序包中拖入两个testTrigger模型,DemoTestTrigger映射,OdiWaitForLogData和OdiSleep组件,按照如下连接
第一个testTrigger模型如下配置
设置为第一步执行,设置后右下角有一个绿色三角
一般信息
选项
第二个testTrigger模型如下配置
一般信息
选项
OdiWaitForLogData配置信息
CDC集在SELECT * FROM SNP_CDC_SET;中找
轮询间隔是OdiWaitForLogData定时检测一次CDC集是否有变化的间隔
配置好后,点击运行,即可开始运行,可在步骤页中查看运行情况
8.调度(定时/触发)
程序包创建好后,右键刚才创建的程序包,生成场景,点击确定
找到新建的场景,在调度下右键新建调度
逻辑代理选择OracleDIAgent
执行标签下为程序包执行时间
选择启动时,则在启动调度时调用程序包
选择每小时/天/周,则是每小时/天/周执行,可在上面的状态中选择开始时间,结束时间,每天执行时间,可以对于每小时/天/周执行的程序包或映射进行管理,但这个配置对闭环程序包无效,因为闭环程序包开始后只有出错或管理员强行关闭,否则不会结束
调度做好后,在OracleDIAgent中点击更新调度
9.遇到的问题
Caused By: java.sql.BatchUpdateException: ORA-01691: unable to extend lob segment TESTUSER.SYS_LOB0000178918C00006$$ by 1024 in tablespace TESTUSER_DATA
表空间不足
Caused By: java.sql.SQLSyntaxErrorException: ORA-00904: "TARG"."LAST_DATE": invalid identifier
JKM没有选择UPDATE_DATE_COL_NAME
ODI-1217: Session test_物理_SESS (10951) fails with return code ODI-1298.
DI-1226: Step 物理_STEP fails after 1 attempt(s).
DI-1227: Task SERIAL-MAP_MAIN- fails on the source connection.
DI-1298: Serial task "SERIAL-MAP_MAIN- (10)" failed because child task "SERIAL-EU-MD_UNIT (20)" is in error.
DI-1298: Serial task "SERIAL-EU-MD_UNIT (20)" failed because child task "Create Oracle directory on SOURCE-LKM Oracle to Oracle (datapump)- (30)" is in error.
DI-1227: Task Create Oracle directory on SOURCE-LKM Oracle to Oracle (datapump)- fails on the source connection WC_SMEC.
aused By: java.sql.SQLSyntaxErrorException: ORA-01031: insufficient privileges
LKM选择了LKM Oracle to Oracle (datapump),选择此项会在目标Schema建文件
ODI-1228: Task Drop work table-LKM SQL to Oracle- fails on the target connection WCDEV_SMEC.
Caused By: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
表或不存在,之前操作错误,导致表或视图没有建
ODI-1226: Step Physical_STEP fails after 1 attempt(s).
DI-1240: Flow Physical_STEP fails while performing a Insert new rows-IKM Oracle Insert-Load WO_FASTREPAIR_TEST_DEMO_1 operation. This flow loads target table MNT_WO_FASTREPAIR_TEST_DEMO.
DI-1298: Serial task "SERIAL-MAP_MAIN- (10)" failed because child task "SERIAL-EU-FUSION_DEV_UNIT (90)" is in error.
DI-1298: Serial task "SERIAL-EU-FUSION_DEV_UNIT (90)" failed because child task "Insert new rows-IKM Oracle Insert-Load WO_FASTREPAIR_TEST_DEMO_1 (100)" is in error.
DI-1228: Task Insert new rows-IKM Oracle Insert-Load WO_FASTREPAIR_TEST_DEMO_1 fails on the target connection WCDEV_SMEC.
aused By: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (FUSION.MNT_WO_FASTREPAIR_TEST_DEMO_PK) violated
主键重复,IKM没有选择增量同步或没有在插入数据前清除目标表数据
CDC(Last Update Date)同步无法同步从本表复制的数据
入数据的数据来源是JV$视图,CDC(Last Update Date)模式在视图中有一个条件是更新时间必须晚于上次ODI记录的更新时间,所以复制的数据时间不符合,结果无法同步
调度在程序包和映射修改后需要重新生成,否则会执行之前的程序包和映射
一个映射只能同时捕获一张表的变化
10.附录
建议新建一个Schema,赋予DBA权限,用于同步
create user odi identified by smec3030;//创建odi Schema,密码为smec3030
grant connect,resource,dba to odi;//授予权限
grant create any directory to odi;//授予创建文件夹权限
选择一致性CDC同步(lastupdatedate)需要注意,更新lastupdatedate时,只有lastupdatedate比ODI CDC表上次记录时间晚的行才会被记录到,所有如果lastupdatedate晚于当前时间可能造成无法记录到时间
select * from FUSION.SNP_CDC_SUBS//添加订阅后,会在该表添加一条数据,取消订阅,该条记录取消
select * from FUSION.SNP_CDC_SET_TABLE
select * from FUSION.SNP_CDC_OBJECTS
select * from I$ODI_TEST_UD_SOURCE_SYNONYM;//临时插入表,在数据同步开始时创建,数据同步结束时删除
select * from j$ODI_TEST_UD_SOURCE_SYNONYM;//数据同步表 基于Trigger的表会在触发Trigger时向表插入数据,lastupdatedate时则是锁定窗口时向该表插入数据
select * from jv$dODI_TEST_UD_SOURCE_SYNONYM;//数据同步视图 lastupdatedate时锁定用户后可以查到数据
select * from jv$ODI_TEST_UD_SOURCE_SYNONYM;//数据同步视图,该视图中有东西,然后同步基本没有问题 lastupdatedate时锁定用户后可以查到数据