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 <Empty Value>.
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時鎖定用戶後可以查到數據