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
或19c cdb
版本資料庫。不支援:
12c cdb
和18c 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
,則您需要使用如下語句進一步確認該資料庫是否為cdb
類型的資料庫。DataWorksData Integration即時同步任務暫不支援使用12c
和18c
版本的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 on sys.ICOL$ to '同步帳號'; //授權同步帳號查看資料庫中的對象。sys.obj$表是Oracle字典表中的對象基礎資料表,存放Oracle的所有對象。
如果您涉及使用離線全量同步資料,還需要執行如下命令,授權同步帳號所有表的查詢許可權。
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';
,查詢目標表的所有資訊,擷取資料類型。
建立資料來源
在進行資料同步任務開發時,您需要在DataWorks上建立一個對應的資料來源,操作流程請參見建立並管理資料來源,詳細的配置參數解釋可在配置介面查看對應參數的文案提示。
資料同步任務開發:Oracle同步流程引導
資料同步任務的配置入口和通用配置流程可參見下文的配置指導。
單表離線同步任務配置指導
操作流程請參見通過嚮導模式配置離線同步任務、通過指令碼模式配置離線同步任務。
指令碼模式配置的全量參數和指令碼Demo請參見下文的附錄:指令碼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不進行任何安全性校正。
附錄:指令碼Demo與參數說明
離線任務指令碼配置方式
如果您配置離線任務時使用指令碼模式的方式進行配置,您需要按照統一的指令碼格式要求,在任務指令碼中編寫相應的參數,詳情請參見通過指令碼模式配置離線同步任務,以下為您介紹指令碼模式下資料來源的參數配置詳情。