DB2資料來源作為資料中樞,為您提供讀取和寫入DB2資料庫的雙向通道,能夠快速解決海量資料的計算問題。本文為您介紹DataWorks的DB2資料同步的能力支援情況。
支援的版本
DB2 Reader和DB2 Writer使用的DB2驅動版本為IBM Data Server Driver for JDBC and SQLJ 4.11.77。DB2驅動和資料庫服務之間的版本映射請參見官網文檔。
使用限制
DB2 Reader和DB2 Writer支援使用Serverless資源群組和獨享Data Integration資源群組,不支援使用公用資源群組和自訂資源群組。
DB2 Writer通過資料同步架構擷取Reader產生的協議資料,通過insert into
(當主鍵/唯一性索引衝突時,衝突的行會寫不進去)語句,寫入資料至DB2。另外出於效能考慮採用了PreparedStatement + Batch
,並且設定了rewriteBatchedStatements=true
,將資料緩衝到線程上下文Buffer中,當Buffer累計到預定閾值時,才發起寫入請求。
說明 整個任務至少需要具備insert into
的許可權,是否需要其它許可權,取決於您配置任務時在preSql和postSql中指定的語句。
離線同步支援閱讀檢視表。
目前不支援DB2 AES密碼編譯演算法。
支援的欄位類型
離線讀寫
DB2 Reader和DB2 Writer支援大部分DB2類型,但也存在個別類型未被支援的情況,請注意檢查您的資料類型。
DB2 Reader和DB2 Writer針對DB2類型的轉換列表,如下所示。
類型分類 | DB2資料類型 |
整數類 | SMALLINT |
浮點類 | DECIMAL、REAL和DOUBLE |
字串類 | CHAR、CHARACTER、VARCHAR、GRAPHIC、VARGRAPHIC、LONG VARCHAR、CLOB、LONG VARGRAPHIC和DBCLOB |
日期時間類 | DATE、TIME和TIMESTAMP |
布爾類 | 無 |
二進位類 | BLOB |
建立資料來源
在進行資料同步任務開發時,您需要在DataWorks上建立一個對應的資料來源,操作流程請參見建立並管理資料來源,詳細的配置參數解釋可在配置介面查看對應參數的文案提示。
資料同步任務開發
資料同步任務的配置入口和通用配置流程可參見下文的配置指導。
常見問題
主備同步資料恢複問題
主備同步問題指DB2使用主從災備,備庫從主庫不間斷通過binlog恢複資料。由於主備資料同步存在一定的時間差,特別在網路延遲等情況下,會導致備庫同步恢複的資料不是一份目前時間的完整鏡像,與主庫有較大差別。
一致性約束
DB2在資料存放區劃分中屬於RDBMS系統,對外可以提供強一致性資料查詢介面。例如,一次同步任務啟動運行過程中,有其它資料來源寫入資料至該庫。由於資料庫本身的快照特性,DB2 Reader完全不會擷取到寫入的更新資料。
上述是在DB2 Reader單執行緒模式下資料同步一致性的特性,DB2 Reader可以根據您配置資訊並發抽取資料,因此不能嚴格保證資料的一致性。
DB2 Reader根據splitPk切分資料後,會先後啟動多個並發任務完成資料同步。多個並發任務不屬於同一個讀事務且存在時間間隔。對於未經處理資料而言,多並發讀取的快照資料可能存在不完整、不一致的情況。
針對多線程的一致性快照需求,目前在技術上無法實現,只能從工程角度解決。工程化的方式存在取捨,在此提供以下解決思路,您可根據自身情況進行選擇:
資料庫編碼問題
DB2 Reader底層使用JDBC進行資料幫浦,JDBC天然適配各類編碼,並在底層進行了編碼轉換。因此DB2 Reader不需您指定編碼,可以自動識別編碼並轉碼。
增量資料同步的方式
DB2 Reader使用JDBC SELECT陳述式完成資料幫浦工作,因此可以使用SELECT…WHERE…
進行增量資料幫浦,方式如下:
對於業務上無欄位區分新增、修改資料的情況,DB2 Reader無法進行增量資料同步,只能同步全量資料。
SQL安全性
DB2 Reader提供querySql語句交給您自己實現SELECT抽取語句,DB2 Reader本身對querySql不進行任何安全性校正。
附錄:指令碼Demo與參數說明
離線任務指令碼配置方式
如果您配置離線任務時使用指令碼模式的方式進行配置,您需要按照統一的指令碼格式要求,在任務指令碼中編寫相應的參數,詳情請參見通過指令碼模式配置離線同步任務,以下為您介紹指令碼模式下資料來源的參數配置詳情。
Reader指令碼Demo
{
"type":"job",
"version":"2.0",//版本號碼
"steps":[
{
"stepType":"db2",//外掛程式名
"parameter":{
"password":"",//密碼
"jdbcUrl":"",//DB2資料庫的JDBC串連資訊
"column":[
"id"
],
"where":"",//篩選條件。
"splitPk":"",//資料分區
"table":"",//表名
"username":""//使用者名稱
},
"name":"Reader",
"category":"reader"
},
{
"stepType":"stream",
"parameter":{},
"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"
}
]
}
}
Reader指令碼參數
參數 | 描述 | 是否必選 | 預設值 |
datasource | 資料來源名稱,指令碼模式支援添加資料來源,此配置項填寫的內容必須要與添加的資料來源名稱保持一致。 | 是 | 無 |
jdbcUrl | 描述的是到DB2資料庫的JDBC串連資訊,jdbcUrl按照DB2官方規範,DB2格式為jdbc:db2://ip:port/database ,並可以填寫串連附件控制資訊。 | 是 | 無 |
username | 資料來源的使用者名稱。 | 是 | 無 |
password | 資料來源指定使用者名稱的密碼。 | 是 | 無 |
table | 所選取的需要同步的表,一個作業只能支援一個表同步。 | 是 | 無 |
column | 所配置的表中需要同步的列名集合,使用JSON的數組描述欄位資訊,預設使用所有列配置。例如[ * ]: 支援列裁剪,即可以匯出部分列。 支援列換序,即可以不根據表Schema資訊順序匯出列。 支援常量配置,您需要遵循DB2的SQL文法格式。例如,["id", "1", "'const name'", "null", "upper('abc_lower')", "2.3" , "true"] : column必須顯示您指定同步的列集合,不允許為空白 。
| 是 | 無 |
splitPk | DB2 Reader進行資料幫浦時,如果指定splitPk,表示您希望使用splitPk代表的欄位進行資料分區。資料同步系統會啟動並發任務進行資料同步,以提高資料同步的效能: | 否 | "" |
where | 篩選條件,DB2 Reader根據指定的column、table、where條件拼接SQL,並根據該SQL抽取資料。 在實際業務情境中,通常會選擇當天的資料進行同步,可以指定where條件為gmt_create>$bizdate 。where條件可以有效地進行業務增量同步處理。如果該值為空白,代表同步全表所有的資訊。 | 否 | 無 |
querySql | 在部分業務情境中,where配置項不足以描述所篩選的條件,您可以通過該配置型來自訂篩選SQL。當您配置該項後,資料同步系統會忽略table、column等配置,直接使用該配置項的內容篩選資料。 例如,您需要在多表Join後同步資料,使用select a,b from table_a join table_b on table_a.id = table_b.id 。當您配置querySql時,DB2 Reader直接忽略table、column、where條件的配置。 | 否 | 無 |
fetchSize | 該配置項定義了外掛程式和資料庫伺服器端每次批量資料擷取條數,該值決定了資料同步系統和伺服器端的網路互動次數,能夠較大的提升資料幫浦效能。
說明 fetchSize值過大(>2048)可能造成資料同步進程OOM。 | 否 | 1024 |
Writer指令碼Demo
{
"type":"job",
"version":"2.0",//版本號碼。
"steps":[
{
"stepType":"stream",
"parameter":{},
"name":"Reader",
"category":"reader"
},
{
"stepType":"db2",//外掛程式名。
"parameter":{
"postSql":[],//執行資料同步任務之後率先執行的SQL語句。
"password":"",//密碼。
"jdbcUrl":"jdbc:db2://ip:port/database",//DB2資料庫的JDBC串連資訊。
"column":[
"id"
],
"batchSize":1024,//一次性批量提交的記錄數大小。
"table":"",//表名。
"username":"",//使用者名稱。
"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"
}
]
}
}
Writer指令碼參數
參數 | 描述 | 是否必選 | 預設值 |
jdbcUrl | 描述的是到DB2資料庫的JDBC串連資訊,JDBC URL遵循DB2官方規範。DB2格式為jdbc:db2://ip:port/database,您還可以填寫串連附件控制資訊。 | 是 | 無 |
username | 資料來源的使用者名稱 。 | 是 | 無 |
password | 資料來源指定使用者名稱的密碼 。 | 是 | 無 |
table | 所選取的需要同步的表 。 | 是 | 無 |
column | 目標表需要寫入資料的欄位,欄位之間用英文逗號分隔。例如:"column": ["id", "name", "age"]。如果要依次寫入全部列,使用(*)表示。例如"column": ["*"] 。 | 是 | 無 |
preSql | 執行資料同步任務之前率先執行的SQL語句,目前僅允許執行一條SQL語句,例如清除舊資料。 | 否 | 無 |
postSql | 執行資料同步任務之後執行的SQL語句,目前嚮導模式僅允許執行一條SQL語句,指令碼模式可以支援多條SQL語句,例如加上某一個時間戳記。 | 否 | 無 |
batchSize | 一次性批量提交的記錄數大小,該值可以極大減少資料同步系統與Db2的網路互動次數,並提升整體輸送量。如果該值設定過大,會導致資料同步運行進程OOM異常。 | 否 | 1024 |