Oracle資料來源為您提供讀取和寫入Oracle雙向通道的功能,方便您後續可以通過嚮導模式和指令碼模式配置資料同步任務。本文為您介紹DataWorks的Oracle資料同步能力支援情況。
支援的版本
離線讀寫
版本 | 離線讀(Oracle Reader) | 離線寫(Oracle Writer) |
Oracle 11.2 or 11gR2 | 支援 | 支援 |
Oracle 12.1 or 12cR1 | 支援 | 支援 |
Oracle 12.2 or 12cR2 | 支援(新版本特性不支援) | 支援(新版本特性不支援) |
Oracle 18.3 | 支援(新版本特性不支援) | 支援(新版本特性不支援) |
Oracle 19.x | 支援(新版本特性不支援) | 支援(新版本特性不支援) |
Oracle 21.1 | 支援(新版本特性不支援) | 支援(新版本特性不支援) |
Oracle Writer外掛程式使用ojdbc6-12.1.1.jar驅動。
即時讀
支援:
11g R2 以上
、12c non cdb
、18c non cdb
或19c non cdb
版本資料庫。不支援:
12c cdb
、18c cdb
及19c cdb
版本資料庫。
資料庫容器CDB(Container Database)是Oracle 12c及之後版本的資料庫新特性,用於承載多個可插拔資料庫PDB(Pluggable Database)。
使用限制
當前Data Integration同步資料時,僅支援UTF8、AL32UTF8、AL16UTF16及ZHS16GBK編碼格式。
Oracle單一實例,當天即時同步最大支援同步500G增量資料。
DataWorks的Data Integration即時同步Oracle資料是基於Oracle Logminer日誌分析工具實現的,Oracle僅支援在主庫中為主庫或備庫開啟補充日誌。
離線同步支援閱讀檢視表。
支援的欄位類型
欄位類型 | 離線讀(Oracle Reader) | 離線寫(Oracle Writer) | 即時讀 |
NUMBER | 支援 | 支援 | 支援 |
BINARY FLOAT | 支援 | 支援 | 支援 |
BINARY DOUBLE | 支援 | 支援 | 支援 |
CHAR | 支援 | 支援 | 支援 |
NCHAR | 支援 | 支援 | 支援 |
VARCHAR2 | 支援 | 支援 | 支援 |
NVARCHAR2 | 支援 | 支援 | 支援 |
DATE | 支援 | 支援 | 支援 |
TIMESTAMP | 支援 | 支援 | 支援 |
TIMESTAMP WITH TIME ZONE | 支援 | 支援 | 不支援 |
TIMESTAMP WITH LOCAL TIME ZONE | 支援 | 支援 | 不支援 |
CLOB | 支援 | 支援 | 支援 |
BLOB | 支援 | 支援 | 支援 |
RAW | 支援 | 支援 | 支援 |
ROWID | 不支援 | 不支援 | 支援 |
UROWID | 不支援 | 不支援 | 支援 |
FLOAT | 支援 | 支援 | 支援 |
INTERVAL DAY TO SECOND | 不支援 | 不支援 | 支援 |
INTERVAL YEAR TO MONTH | 不支援 | 不支援 | 支援 |
BFILE | 不支援 | 不支援 | 不支援 |
LONG | 不支援 | 不支援 | 不支援 |
LONG RAW | 不支援 | 不支援 | 不支援 |
NCLOB | 支援 | 支援 | 不支援 |
STRUCT | 支援 | 支援 | 不支援 |
User-Defined Types | 不支援 | 不支援 | 不支援 |
AnyType | 不支援 | 不支援 | 不支援 |
AnyData | 不支援 | 不支援 | 不支援 |
AnyDataSet | 不支援 | 不支援 | 不支援 |
XmlType | 不支援 | 不支援 | 不支援 |
Spatial Types | 不支援 | 不支援 | 不支援 |
Media Types | 不支援 | 不支援 | 不支援 |
Oracle Reader針對Oracle類型的轉換列表,如下所示。
類型分類 | Oracle資料類型 |
整數類 | NUMBER、RAWID、INTEGER、INT和SMALLINT |
浮點類 | NUMERIC、DECIMAL、FLOAT、DOUBLE PRECISIOON和REAL |
字串類 | LONG、CHAR、NCHAR、VARCHAR、VARCHAR2、NVARCHAR2、CLOB、NCLOB、CHARACTER、CHARACTER VARYING、CHAR VARYING、NATIONAL CHARACTER、NATIONAL CHAR、NATIONAL CHARACTER VARYING、NATIONAL CHAR VARYING和NCHAR VARYING |
日期時間類 | TIMESTAMP和DATE |
布爾型 | BIT和BOOL |
二進位類 | BLOB、BFILE、RAW和LONG RAW |
資料同步前準備:Oracle環境準備
在DataWorks上進行資料同步前,您需要參考本文提前在Oracle側進行資料同步環境準備,以便在DataWorks上進行Oracle資料同步任務配置與執行時服務正常。以下為您介紹Oracle同步前的相關環境準備。
準備工作1:確認Oracle資料庫版本
不同同步情境下支援的Oracle資料庫版本不一致,同步前您需要檢查Oracle資料庫版本是否為支援的版本。
您可以通過如下任意語句查看Oracle資料庫的版本。
語句一:
select * from v$version;
語句二:
select version from v$instance;
如果查看到的Oracle資料庫版本為
12c
、18c
或19c
,則您需要使用如下語句進一步確認該資料庫是否為cdb
類型的資料庫。DataWorksData Integration即時同步任務暫不支援使用cdb
類型的Oracle資料庫。select name,cdb,open_mode,con_id from v$database;
準備工作2:建立帳號並配置帳號許可權
您需要規劃一個資料庫的登入賬戶用於後續執行操作,此帳號需要擁有Oracle的相關操作許可權。
建立帳號。操作詳情請參見建立Oracle帳號。
配置許可權。
您可以參考以下命令為帳號添加相關許可權。如下執行語句在實際使用時,請替換
'同步帳號'
為上述建立的帳號。grant create session to '同步帳號'; //授權同步帳號登入資料庫。 grant connect to '同步帳號'; //授權同步帳號串連資料庫。 grant select on nls_database_parameters to '同步帳號'; //授權同步帳號查詢資料庫的nls_database_parameters系統配置。 grant select on all_users to '同步帳號'; //授權同步帳號查詢資料庫中的所有使用者。 grant select on all_objects to '同步帳號'; //授權同步帳號查詢資料庫中的所有對象。 grant select on DBA_MVIEWS to '同步帳號'; //授權同步帳號查看資料庫的物化視圖。 grant select on DBA_MVIEW_LOGS to '同步帳號'; //授權同步帳號查看資料庫的物化視圖日誌。 grant select on DBA_CONSTRAINTS to '同步帳號'; //授權同步帳號查看資料庫所有表的約束資訊。 grant select on DBA_CONS_COLUMNS to '同步帳號'; //授權同步帳號查看資料庫中所有表指定約束中所有列的相關資訊。 grant select on all_tab_cols to '同步帳號'; //授權同步帳號查看資料庫中表、視圖和叢集中列的相關資訊。 grant select on sys.obj$ to '同步帳號'; //授權同步帳號查看資料庫中的對象。sys.obj$表是Oracle字典表中的對象基礎資料表,存放Oracle的所有對象。 grant select on SYS.COL$ to '同步帳號'; //授權同步帳號查看資料庫表中列的定義資訊。SYS.COL$用於儲存表中列的定義資訊。 grant select on sys.USER$ to '同步帳號'; //授權同步帳號查看資料庫的系統資料表。sys.USER$是使用者會話的預設服務。 grant select on sys.cdef$ to '同步帳號'; //授權同步帳號查看資料庫的系統資料表。 grant select on sys.con$ to '同步帳號'; //授權同步帳號查看資料庫的約束資訊。sys.con$記錄了Oracle的相關約束資訊。 grant select on all_indexes to '同步帳號'; //授權同步帳號查看資料庫的所有索引。 grant select on v_$database to '同步帳號'; //授權同步帳號查看資料庫的v_$database視圖。 grant select on V_$ARCHIVE_DEST to '同步帳號'; //授權同步帳號查看資料庫的V_$ARCHIVE_DEST視圖。 grant select on v_$log to '同步帳號'; //授權同步帳號查看資料庫的v_$log視圖。v_$log用於顯示控制檔案中的記錄檔資訊。 grant select on v_$logfile to '同步帳號'; //授權同步帳號查看資料庫的v_$logfile視圖。v_$logfile包含有關Redo記錄檔的資訊。 grant select on v_$archived_log to '同步帳號'; //授權同步帳號查看資料庫的v$archived_log視圖。v$archived_log包含有關歸檔日誌的相關資訊。 grant select on V_$LOGMNR_CONTENTS to '同步帳號'; //授權同步帳號查看資料庫的V_$LOGMNR_CONTENTS視圖。 grant select on DUAL to '同步帳號'; //授權同步帳號查看資料庫的DUAL表。DUAL是用來構成select文法規則的虛擬表,Oracle的中DUAL中僅保留一條記錄。 grant select on v_$parameter to '同步帳號'; //授權同步帳號查看資料庫的v_$parameter視圖。v$parameter是Oracle的動態字典表,儲存了資料庫參數的設定值。 grant select any transaction to '同步帳號'; //授權同步帳號查看資料庫的任意事務。 grant execute on SYS.DBMS_LOGMNR to '同步帳號'; //授權同步帳號使用資料庫的Logmnr工具。Logmnr工具可以協助您分析事務,並找回丟失的資料。 grant alter session to '同步帳號'; //授權同步帳號修改資料庫的串連。 grant select on dba_objects to '同步帳號'; //授權同步帳號查看資料庫的所有對象。 grant select on v_$standby_log to '同步帳號'; //授權同步帳號查看資料庫的v_$standby_log視圖。v_$standby_log包含備用庫的歸檔日誌。 grant select on v_$ARCHIVE_GAP to '同步帳號'; //授權同步帳號查詢缺失的歸檔日誌。
如果您涉及使用離線全量同步資料,還需要執行如下命令,授權同步帳號所有表的查詢許可權。
grant select any table to '同步帳號';
Oracle 12c及之後的版本需要執行如下命令,授權同步帳號可以進行日誌挖掘。Oracle 12c之前的版本,內建日誌挖掘功能,無需執行該命令。
grant LOGMINING TO '同步帳號';
準備工作3:開啟歸檔日誌、補充日誌並切換Redo記錄檔
開啟歸檔日誌,SQL語句如下。
shutdown immediate; startup mount; alter database archivelog; alter database open;
開啟補充日誌。
您可以根據需要選擇開啟合適的補充日誌,SQL語句如下。
alter database add supplemental log data(primary key) columns; //為資料庫的主鍵列開啟補充日誌。 alter database add supplemental log data(unique) columns; //為資料庫的唯一索引列開啟補充日誌。
切換Redo記錄檔。
開啟補充日誌後,您需要多次(一般建議執行5次)執行如下命令,切換Redo記錄檔。
alter system switch logfile;
說明多次執行上述命令切換Redo記錄檔,是保證當前記錄檔被寫滿後可以切換至下一個記錄檔。使執行過的操作記錄不會丟失,便於後續恢複資料。
準備工作4:檢查資料庫的字元編碼
您需要在當前使用的資料庫中,執行如下命令檢查資料庫的字元編碼。
select * from v$nls_parameters where PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
v$nls_parameters用於存放資料庫參數的設定值。
NLS_CHARACTERSET及NLS_NCHAR_CHARACTERSET為資料庫字元集和國家字元集,表明Oracle中兩大類字元型資料的儲存類型。
前Data Integration同步資料時,僅支援UTF8、AL32UTF8、AL16UTF16及ZHS16GBK編碼格式。如果資料庫中包含不支援的字元編碼,請進行修改後再執行資料同步。
準備工作5:檢查資料庫表的資料類型
您可以使用查看錶的SQL相關語句(SELECT)查詢資料庫表的資料類型。樣本查看'tablename'表資料類型的語句如下。
select COLUMN_NAME,DATA_TYPE from all_tab_columns where TABLE_NAME='tablename';
COLUMN_NAME:表的列名稱。
DATA_TYPE:對應列的資料類型。
all_tab_columns:存放資料庫表所有列相關資訊的視圖。
TABLE_NAME:需要查詢的目標表的名稱。執行上述語句時,請替換'tablename'為實際需要查看的表名稱。
您也可以執行select * from 'tablename';
,查詢目標表的所有資訊,擷取資料類型。
資料同步任務開發:Oracle同步流程引導
Oracle資料同步任務的配置入口和通用配置流程指導可參見下文的配置指導,詳細的配置參數解釋可在配置介面查看對應參數的文案提示。
建立資料來源
在進行資料同步任務開發時,您需要在DataWorks上建立一個對應的資料來源,操作流程請參見建立並管理資料來源。
單表離線同步任務配置指導
操作流程請參見通過嚮導模式配置離線同步任務、通過指令碼模式配置離線同步任務。
指令碼模式配置的全量參數和指令碼Demo請參見下文的附錄:Oracle指令碼Demo與參數說明。
單表即時同步任務配置指導
操作流程請參見DataStudio側即時同步任務配置。
整庫離線、整庫(即時)全增量、整庫(即時)分庫分表等整庫層級同步配置指導
操作流程請參見Data Integration側同步任務配置。
常見問題
主備同步資料恢複問題
主備同步問題指Oracle使用主從災備,當主庫報錯切換至備庫後,備庫從主庫不斷地通過binlog恢複資料。由於主備資料同步存在一定的時間差,在網路延遲等特定情況下,會導致備庫同步恢複的資料與主庫有較大差別,從備庫同步的資料不是一份目前時間的完整鏡像。
一致性約束
Oracle在資料存放區劃分中屬於RDBMS系統,對外可以提供強一致性資料查詢介面。例如,在一次同步任務啟動啟動並執行過程中,當該庫存在其它資料寫入方寫入資料時,由於資料庫本身的快照特性,Oracle Reader不會擷取到寫入的新資料。
上述是在Oracle Reader單執行緒模式下實現資料同步的一致性。Oracle Reader根據您配置的資訊並發抽取資料,則不能嚴格保證資料一致性。
當Oracle Reader根據splitPk進行資料切分後,會先後啟動多個並發任務完成資料同步。多個並發任務相互之間不屬於同一個讀事務,同時多個並發任務存在時間間隔。因此該資料並不是完整的、一致的資料快照資訊。
針對多線程的一致性快照需求,目前在技術上無法實現,只能從工程角度解決。工程化的方式存在取捨,在此提供以下解決思路,您可以根據自身情況進行選擇。
使用單線程同步,即不再進行資料切片。缺點是速度比較慢,但是能夠很好保證一致性。
關閉其它資料寫入方,保證當前資料為待用資料。例如,鎖表、關閉備庫同步等。缺點是可能影響線上業務。
資料庫編碼問題
Oracle Reader底層使用JDBC進行資料幫浦,JDBC天然適配各類編碼,並在底層進行了編碼轉換。因此Oracle Reader無需您指定編碼,可以自動擷取編碼並轉碼。
增量資料同步的方式
Oracle Reader使用JDBC SELECT陳述式完成資料幫浦工作,因此您可以使用
SELECT…WHERE…
進行增量資料幫浦,方式如下:資料庫線上應用寫入資料庫時,填充modify欄位為更改時間戳記,包括新增、更新、刪除(邏輯刪除)。對於該類應用,Oracle Reader只需要where條件後跟上一同步階段時間戳記即可。
對於新增流水型資料,Oracle Reader在where條件後跟上一階段最大自增ID即可。
對於業務上無欄位區分新增、修改資料的情況,Oracle Reader無法進行增量資料同步,只能同步全量資料。
SQL安全性
Oracle Reader為您提供querySql功能,您可以自行實現SELECT抽取語句。Oracle Reader本身對querySql不進行任何安全性校正。
附錄:Oracle指令碼Demo與參數說明
附錄:離線任務指令碼配置方式
如果您配置離線任務時使用指令碼模式的方式進行配置,您需要在任務指令碼中按照指令碼的統一格式要求編寫指令碼中的reader參數和writer參數,指令碼模式的統一要求請參見通過指令碼模式配置離線同步任務,以下為您介紹指令碼模式下的資料來源的Reader參數和Writer參數的指導詳情。
Oracle Reader指令碼Demo
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "oracle",
"parameter": {
"selectedDatabase": "AUTOTEST",
"indexes": [],
"datasource": "oracle_test",
"envType": 0,
"useSpecialSecret": true,
"column": [
"id"
],
"where": "",
"splitPk": "id",
"encoding": "UTF-8",
"table": "AUTOTEST.table01"
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "odps",
"parameter": {
},
"name": "Writer",
"category": "writer"
},
{
"name": "Processor",
"stepType": null,
"category": "processor",
"copies": 1,
"parameter": {
"nodes": [],
"edges": [],
"groups": [],
"version": "2.0"
}
}
],
"setting": {
"executeMode": null,
"errorLimit": {
"record": ""
},
"speed": {
"concurrent": 2,
"throttle": false
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
Oracle Reader指令碼參數
參數 | 描述 | 是否必選 | 預設值 |
datasource | 資料來源名稱,指令碼模式支援添加資料來源,該配置項輸入的內容必須和添加的資料來源名稱保持一致。 | 是 | 無 |
selectedDatabase | 待同步資料庫的schema。 | 是 | 無 |
table | 選取的需要同步的表名稱,格式需要配置為 說明 例如,selectedDatabase為 | 是 | 無 |
column | 所配置的表中需要同步的列名集合,使用JSON的數組描述欄位資訊。預設使用所有列配置,例如["*"]。
| 是 | 無 |
splitFactor | 切分因子,可以配置同步資料的切分份數,如果配置了多並發,會按照並發數 * splitFactor份來切分。例如,並發數=5,splitFactor=5,則會按照5*5=25份來切分,在5個並發線程上執行。 說明 建議取值範圍:1~100,過大會導致記憶體溢出。 | 否 | 5 |
splitMode | 切分模式,包括:
說明 splitMode參數需要與splitPk參數配合使用。
| 否 | randomSampling |
splitPk | Oracle Reader進行資料幫浦時,如果指定splitPk,表示您希望使用splitPk代表的欄位進行資料分區,資料同步因此會啟動並發任務進行資料同步,可以提高資料同步的效能。
說明 splitPK欄位在視圖的情況下不能使用ROWID。 | 否 | 無 |
where | 篩選條件,Oracle Reader根據指定的column、table和where條件拼接SQL,並根據該SQL進行資料幫浦。例如,在測試時指定where條件為row_number()。
| 否 | 無 |
querySql(進階模式,嚮導模式不支援) | 在部分業務情境中,where配置項不足以描述所篩選的條件,您可以通過該配置來自訂篩選SQL。當您配置該項後,資料同步系統就會忽略table和column等配置,直接使用該配置項的內容對資料進行篩選。例如,需要進行多表Join後同步資料,則使用 | 否 | 無 |
fetchSize | 該配置項定義了外掛程式和資料庫伺服器端每次批量資料擷取條數,該值決定了資料同步系統和伺服器端的網路互動次數,能夠較大的提升資料幫浦效能。 說明 fetchSize值過大(>2048)可能造成資料同步進程OOM。 | 否 | 1,024 |
Oracle Writer指令碼Demo
{
"type":"job",
"version":"2.0",//版本號碼。
"steps":[
{
"stepType":"stream",
"parameter":{},
"name":"Reader",
"category":"reader"
},
{
"stepType":"oracle",//外掛程式名。
"parameter":{
"postSql":[],//執行資料同步任務之後執行的SQL語句。
"datasource":"",
"session":[],//資料庫連接會話參數。
"column":[//欄位。
"id",
"name"
],
"encoding":"UTF-8",//編碼格式。
"batchSize":1024,//一次性批量提交的記錄數大小。
"table":"",//表名。
"preSql":[]//執行資料同步任務之前執行的SQL語句。
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"//錯誤記錄數。
},
"speed":{
"throttle":true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。
"concurrent":1, //作業並發數。
"mbps":"12"//限流,此處1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
Oracle Writer指令碼參數
參數 | 描述 | 是否必選 | 預設值 |
datasource | 資料來源名稱,指令碼模式支援添加資料來源,此配置項填寫的內容必須要與添加的資料來源名稱保持一致。 | 是 | 無 |
table | 目標表名稱,如果表的schema資訊和上述配置username不一致,請使用schema.table的格式填寫table資訊。 | 是 | 無 |
writeMode | 選擇匯入模式,僅支援insert into。當主鍵或唯一性索引衝突時,會寫不進去衝突的行,以髒資料的形式體現。 | 否 | insert into |
column | 目標表需要寫入資料的欄位,欄位之間用英文逗號分隔。例如 | 是 | 無 |
preSql | 執行資料同步任務之前率先執行的SQL語句。目前嚮導模式僅允許執行一條SQL語句,指令碼模式可以支援多條SQL語句,例如清除舊資料。 | 否 | 無 |
postSql | 執行資料同步任務之後執行的SQL語句。目前嚮導模式僅允許執行一條SQL語句,指令碼模式可以支援多條SQL語句,例如加上某一個時間戳記。 | 否 | 無 |
batchSize | 一次性批量提交的記錄數大小,該值可以極大減少資料同步系統與Oracle的網路互動次數,並提升整體輸送量。如果該值設定過大,會導致資料同步運行進程OOM異常。 | 否 | 1,024 |