全部產品
Search
文件中心

DataWorks:Oracle資料來源

更新時間:Jun 19, 2024

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 cdb18c non cdb19c non cdb版本資料庫。

  • 不支援:

    12c cdb18c cdb19c 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資料庫版本是否為支援的版本。

  1. 您可以通過如下任意語句查看Oracle資料庫的版本。

    • 語句一:

      select * from v$version;
    • 語句二:

      select version from v$instance;
  2. 如果查看到的Oracle資料庫版本為12c18c19c,則您需要使用如下語句進一步確認該資料庫是否為cdb類型的資料庫。DataWorksData Integration即時同步任務暫不支援使用cdb類型的Oracle資料庫。

    select name,cdb,open_mode,con_id from v$database;

準備工作2:建立帳號並配置帳號許可權

您需要規劃一個資料庫的登入賬戶用於後續執行操作,此帳號需要擁有Oracle的相關操作許可權。

  1. 建立帳號。操作詳情請參見建立Oracle帳號

  2. 配置許可權。

    您可以參考以下命令為帳號添加相關許可權。如下執行語句在實際使用時,請替換'同步帳號'為上述建立的帳號。

    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記錄檔

  1. 開啟歸檔日誌,SQL語句如下。

    shutdown immediate;
    startup mount;
    alter database archivelog;
    alter database open;
  2. 開啟補充日誌。

    您可以根據需要選擇開啟合適的補充日誌,SQL語句如下。

    alter database add supplemental log data(primary key) columns; //為資料庫的主鍵列開啟補充日誌。
    alter database add supplemental log data(unique) columns; //為資料庫的唯一索引列開啟補充日誌。
  3. 切換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_CHARACTERSETNLS_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上建立一個對應的資料來源,操作流程請參見建立並管理資料來源

單表離線同步任務配置指導

單表即時同步任務配置指導

操作流程請參見DataStudio側即時同步任務配置

整庫離線、整庫(即時)全增量、整庫(即時)分庫分表等整庫層級同步配置指導

操作流程請參見Data Integration側同步任務配置

常見問題

  • 即時同步Oracle、PolarDB、MySQL任務重複報錯

  • 主備同步資料恢複問題

    主備同步問題指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

選取的需要同步的表名稱,格式需要配置為schema.tableName

說明

例如,selectedDatabaseAUTOTEST,表名稱為table01,則table需配置為AUTOTEST.table01

column

所配置的表中需要同步的列名集合,使用JSON的數組描述欄位資訊。預設使用所有列配置,例如["*"]

  • 支援列裁剪,即可以匯出部分列。

  • 支援列換序,即可以不根據表Schema資訊的順序匯出列。

  • 支援常量配置,您需要按照JSON格式進行配置。

    ["id", "1", "'mingya.wmy'", "null", "to_char(a + 1)", "2.3" , "true"]
    • id為普通列名。

    • 1為整型數字常量。

    • 'mingya.wmy'為字串常量(注意需要加上一對單引號)。

    • null為空白指標。

    • to_char(a + 1)為運算式。

    • 2.3為浮點數。

    • true為布爾值。

  • column必須顯示填寫,不允許為空白。

splitFactor

切分因子,可以配置同步資料的切分份數,如果配置了多並發,會按照並發數 * splitFactor份來切分。例如,並發數=5,splitFactor=5,則會按照5*5=25份來切分,在5個並發線程上執行。

說明

建議取值範圍:1~100,過大會導致記憶體溢出。

5

splitMode

切分模式,包括:

  • averageInterval:平均採樣,根據splitPK找到最大值和最小值,然後按照切分數目平均切分。

  • randomSampling:隨機採樣,在所有資料中隨機找到一定數目作為切分點。

說明

splitMode參數需要與splitPk參數配合使用。

  • 當splitPk為數實值型別時,splitMode需要配置為averageInterval

  • 當splitPk為字串類型時,splitMode需要配置為randomSampling

randomSampling

splitPk

Oracle Reader進行資料幫浦時,如果指定splitPk,表示您希望使用splitPk代表的欄位進行資料分區,資料同步因此會啟動並發任務進行資料同步,可以提高資料同步的效能。

  • 推薦使用表主鍵作為splitPk,因為表主鍵通常情況下比較均勻,因此切分出來的分區也不容易出現資料熱點。

  • splitPk僅支援配置為數實值型別或字串類型,並且splitMode參數需要與splitPk參數配合使用。

    • 當splitPk為數實值型別時,splitMode需要配置為averageInterval

    • 當splitPk為字串類型時,splitMode需要配置為randomSampling

  • 如果不填寫splitPk,將視作您不對單表進行切分,Oracle Reader使用單通道同步全量資料。

說明

splitPK欄位在視圖的情況下不能使用ROWID。

where

篩選條件,Oracle Reader根據指定的columntablewhere條件拼接SQL,並根據該SQL進行資料幫浦。例如,在測試時指定where條件為row_number()

  • where條件可以有效地進行業務增量同步處理 。

  • where條件不配置或為空白時,將視作全表同步資料 。

querySql(進階模式,嚮導模式不支援)

在部分業務情境中,where配置項不足以描述所篩選的條件,您可以通過該配置來自訂篩選SQL。當您配置該項後,資料同步系統就會忽略tablecolumn等配置,直接使用該配置項的內容對資料進行篩選。例如,需要進行多表Join後同步資料,則使用select a,b from table_a join table_b on table_a.id = table_b.id。當您配置querySql時,Oracle Reader直接忽略tablecolumnwhere條件的配置。

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

目標表需要寫入資料的欄位,欄位之間用英文逗號分隔。例如"column": ["id”,”name”,”age”]。如果要依次寫入全部列,使用*表示。例如"column":["*"]

preSql

執行資料同步任務之前率先執行的SQL語句。目前嚮導模式僅允許執行一條SQL語句,指令碼模式可以支援多條SQL語句,例如清除舊資料。

postSql

執行資料同步任務之後執行的SQL語句。目前嚮導模式僅允許執行一條SQL語句,指令碼模式可以支援多條SQL語句,例如加上某一個時間戳記。

batchSize

一次性批量提交的記錄數大小,該值可以極大減少資料同步系統與Oracle的網路互動次數,並提升整體輸送量。如果該值設定過大,會導致資料同步運行進程OOM異常。

1,024