DataX之MysqlReader插件的使用介紹
一、原理介紹
MysqlReader是通過JDBC連接方式遠程連接到數據庫,然後根據用戶配置的參數生成SELECT SQL語句或者根據用戶自定義的SQL語句,執行SQL獲取數據庫的目標信息,然後採用DataX自定義數據類型封裝結果集,交由Writer插件處理。
簡而言之, MysqlReader就是通過JDBC的方式連接數據庫,然後通過SELECT SQL獲取結果集。
二、配置樣例介紹
本文主要是介紹如何獲取mysql的數據庫,至於Writer的配置並不會做介紹。因爲DataX的好處就是Reader插件和Writer插件之間,通過DataX框架統一維護異常處理、數據轉換、併發、流控等等核心問題,所以兩者之間可以配置即用,實現自由組合。
1.通過配置參數生成SELECT SQL的樣例
{ "job": { "setting": { "speed": { "channel": 3 }, "errorLimit": { "percentage": 0.02 } }, "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "root", "password": "root", "column": [ "id", "student_name", "score"
],
"splitPk": "id",
"connection": [
{
"table": [
"student_score"
],
"jdbcUrl": [
"jdbc:mysql://127.0.0.1:3306/test"
]
}
]
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print":true
}
}
}
]
}
}
2.自定義SQL的樣例
{
"job": {
"setting": {
"speed": {
"record":100
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"connection": [
{
"querySql": [
"select id,student_name,score from student_score where score > 60;"
],
"jdbcUrl": [
"jdbc:mysql://127.0.0.1:3306/test111",
"jdbc:mysql://127.0.0.1:3333/test",
"jdbc:mysql://127.0.0.1:3306/test"
]
}
]
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": false,
"encoding": "UTF-8"
}
}
}
]
}
}
3.參數介紹
系統配置參數介紹:
1. speed
描述:DataX提供速度控制配置,包括 通道(併發)、記錄流和字節流三種,可以隨意的控製作業速度。
json 模板: "speed": { "channel": 5, "byte": 1048576, "record": 10000 }
- "channel",控制併發數
- "byte",控制字節流
- "record",控制記錄數
2. errorLimit
描述:DataX提供髒數據控制配置,支持對髒數據按照最大髒數據記錄數閥值或髒數據佔比閥值進行監控,當傳輸過程中,髒數據達到閥值,Job會報錯退出。
json 模板:"errorLimit": {"record": 10,"percentage": 0.01}
- "record",記錄數
- "percentage",百分佔比
MysqlReader配置參數介紹
1. jdbcUrl
描述:描述的是到對端數據庫的JDBC連接信息,使用JSON的數組描述,並支持一個庫填寫多個連接地址。之所以使用JSON數組描述連接信息,是因爲阿里集團內部支持多個IP探測,如果配置了多個,MysqlReader可以依次探測ip的可連接性,直到選擇一個合法的IP。如果全部連接失敗,MysqlReader報錯。 注意,jdbcUrl必須包含在connection配置單元中。對於阿里集團外部使用情況,JSON數組填寫一個JDBC連接即可。
jdbcUrl按照Mysql官方規範,並可以填寫連接附件控制信息。具體請參看Mysql官方文檔。
必選:是
默認值:無
2. username
描述:數據源的用戶名
必選:是
默認值:無
3. password
描述:數據源指定用戶名的密碼必選:是
默認值:無
4. table
描述:所選取的需要同步的表。使用JSON的數組描述,因此支持多張表同時抽取。當配置爲多張表時,用戶自己需保證多張表是同一schema結構,MysqlReader不予檢查表是否同一邏輯表。注意,table必須包含在connection配置單元中。
必選:是
默認值:無
5. column
描述:所配置的表中需要同步的列名集合,使用JSON的數組描述字段信息。用戶使用*代表默認使用所有列配置,例如['*']。
支持列裁剪,即列可以挑選部分列進行導出。
支持列換序,即列可以不按照表schema信息進行導出。
支持常量配置,用戶需要按照Mysql SQL語法格式: ["id", "`table`", "1", "'bazhen.csy'", "null", "to_char(a + 1)", "2.3" , "true"] id爲普通列名,`table`爲包含保留在的列名,1爲整形數字常量,'bazhen.csy'爲字符串常量,null爲空指針,to_char(a + 1)爲表達式,2.3爲浮點數,true爲布爾值。
必選:是
默認值:無
6. splitPk
描述:MysqlReader進行數據抽取時,如果指定splitPk,表示用戶希望使用splitPk代表的字段進行數據分片,DataX因此會啓動併發任務進行數據同步,這樣可以大大提供數據同步的效能。
推薦splitPk用戶使用表主鍵,因爲表主鍵通常情況下比較均勻,因此切分出來的分片也不容易出現數據熱點。
目前splitPk僅支持整形數據切分,不支持浮點、字符串、日期等其他類型
。如果用戶指定其他非支持類型,MysqlReader將報錯!
如果splitPk不填寫,包括不提供splitPk或者splitPk值爲空,DataX視作使用單通道同步該表數據。
必選:否
默認值:空
7. where
描述:篩選條件,MysqlReader根據指定的column、table、where條件拼接SQL,並根據這個SQL進行數據抽取。在實際業務場景中,往往會選擇當天的數據進行同步,可以將where條件指定爲gmt_create > $bizdate 。注意:不可以將where條件指定爲limit 10,limit不是SQL的合法where子句。
where條件可以有效地進行業務增量同步。如果不填寫where語句,包括不提供where的key或者value,DataX均視作同步全量數據。
必選:否
默認值:無
8. querySql
- 描述:在有些業務場景下,where這一配置項不足以描述所篩選的條件,用戶可以通過該配置型來自定義篩選SQL。當用戶配置了這一項之後,DataX系統就會忽略table,column這些配置型,直接使用這個配置項的內容對數據進行篩選,例如需要進行多表join後同步數據,使用select a,b from table_a join table_b on table_a.id = table_b.id
當用戶配置querySql時,MysqlReader直接忽略table、column、where條件的配置
,querySql優先級大於table、column、where選項。
必選:否
默認值:無
4.類型轉換
目前MysqlReader支持大部分Mysql類型,但也存在部分個別類型沒有支持的情況,請注意檢查你的類型。
下面列出MysqlReader針對Mysql類型轉換列表:
DataX 內部類型 | Mysql 數據類型 |
---|---|
Long | int, tinyint, smallint, mediumint, int, bigint |
Double | float, double, decimal |
String | varchar, char, tinytext, text, mediumtext, longtext, year |
Date | date, datetime, timestamp, time |
Boolean | bit, bool |
Bytes | tinyblob, mediumblob, blob, longblob, varbinary |
請注意:
除上述羅列字段類型外,其他類型均不支持
。tinyint(1) DataX視作爲整形
。year DataX視作爲字符串類型
bit DataX屬於未定義行爲
。
5.約束限制
5.1 主備同步數據恢復問題
主備同步問題指Mysql使用主從災備,備庫從主庫不間斷通過binlog恢復數據。由於主備數據同步存在一定的時間差,特別在於某些特定情況,例如網絡延遲等問題,導致備庫同步恢復的數據與主庫有較大差別,導致從備庫同步的數據不是一份當前時間的完整鏡像。
針對這個問題,我們提供了preSql功能,該功能待補充。
5.2 一致性約束
Mysql在數據存儲劃分中屬於RDBMS系統,對外可以提供強一致性數據查詢接口。例如當一次同步任務啓動運行過程中,當該庫存在其他數據寫入方寫入數據時,MysqlReader完全不會獲取到寫入更新數據,這是由於數據庫本身的快照特性決定的。關於數據庫快照特性,請參看MVCC Wikipedia
上述是在MysqlReader單線程模型下數據同步一致性的特性,由於MysqlReader可以根據用戶配置信息使用了併發數據抽取,因此不能嚴格保證數據一致性:當MysqlReader根據splitPk進行數據切分後,會先後啓動多個併發任務完成數據同步。由於多個併發任務相互之間不屬於同一個讀事務,同時多個併發任務存在時間間隔。因此這份數據並不是完整的
、一致的
數據快照信息。
針對多線程的一致性快照需求,在技術上目前無法實現,只能從工程角度解決,工程化的方式存在取捨,我們提供幾個解決思路給用戶,用戶可以自行選擇:
使用單線程同步,即不再進行數據切片。缺點是速度比較慢,但是能夠很好保證一致性。
關閉其他數據寫入方,保證當前數據爲靜態數據,例如,鎖表、關閉備庫同步等等。缺點是可能影響在線業務。
5.3 數據庫編碼問題
Mysql本身的編碼設置非常靈活,包括指定編碼到庫、表、字段級別,甚至可以均不同編碼。優先級從高到低爲字段、表、庫、實例。我們不推薦數據庫用戶設置如此混亂的編碼,最好在庫級別就統一到UTF-8。
MysqlReader底層使用JDBC進行數據抽取,JDBC天然適配各類編碼,並在底層進行了編碼轉換。因此MysqlReader不需用戶指定編碼,可以自動獲取編碼並轉碼。
對於Mysql底層寫入編碼和其設定的編碼不一致的混亂情況,MysqlReader對此無法識別,對此也無法提供解決方案,對於這類情況,導出有可能爲亂碼
。
5.4 增量數據同步
MysqlReader使用JDBC SELECT語句完成數據抽取工作,因此可以使用SELECT...WHERE...進行增量數據抽取,方式有多種:
- 數據庫在線應用寫入數據庫時,填充modify字段爲更改時間戳,包括新增、更新、刪除(邏輯刪)。對於這類應用,MysqlReader只需要WHERE條件跟上一同步階段時間戳即可。
- 對於新增流水型數據,MysqlReader可以WHERE條件後跟上一階段最大自增ID即可。
對於業務上無字段區分新增、修改數據情況,MysqlReader也無法進行增量數據同步,只能同步全量數據。
5.5 Sql安全性
MysqlReader提供querySql語句交給用戶自己實現SELECT抽取語句,MysqlReader本身對querySql不做任何安全性校驗。這塊交由DataX用戶方自己保證。