MysqlReader 插件文檔

快速介紹


MysqlReader 插件實(shí)現(xiàn)了從 MySQL 讀取數(shù)據(jù)。在底層實(shí)現(xiàn)上,MysqlReader 通過 JDBC 連接遠(yuǎn)程 MySQL 數(shù)據(jù)庫,并執(zhí)行相應(yīng)的 SQL 語句將數(shù)據(jù)從 MySQL 庫中 SELECT 出來。

不同于其他關(guān)系型數(shù)據(jù)庫,MysqlReader 不支持 FetchSize

實(shí)現(xiàn)原理


簡而言之,MysqlReader 通過 JDBC 連接器連接遠(yuǎn)程的 MySQL 數(shù)據(jù)庫,并根據(jù)用戶配置的信息生成查詢 SELECT SQL 語句,然后發(fā)送遠(yuǎn)程 MySQL 數(shù)據(jù)庫,并將該 SQL 執(zhí)行返回結(jié)果使用 DataX 自定義的數(shù)據(jù)類型拼裝為抽象的數(shù)據(jù)集,并傳遞給下游 Writer 處理。

對于用戶配置 Table、Colum、Where 的信息,MysqlReader 將其拼裝為 SQL 語句并發(fā)送到 MySQL 數(shù)據(jù)庫;對于用戶配置 querySql 信息,MysqlReader 直接將其發(fā)送到 MySQL 數(shù)據(jù)庫。

功能說明


  1. 配置樣例
  • 配置一個(gè)從 MySQL 數(shù)據(jù)庫同步抽取數(shù)據(jù)到本地的作業(yè):
{
    "job": {
        "setting": {
            "speed": {
                 "channel": 3
            },
            "errorLimit": {
                "record": 0,
                "percentage": 0.02
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "root",
                        "column": [
                            "id",
                            "name"
                        ],
                        "splitPk": "db_id",
                        "connection": [
                            {
                                "table": [
                                    "table"
                                ],
                                "jdbcUrl": [
     "jdbc:mysql://127.0.0.1:3306/database"
                                ]
                            }
                        ]
                    }
                },
               "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "print":true
                    }
                }
            }
        ]
    }
}
  • 配置一個(gè)自定義 SQL 的數(shù)據(jù)庫同步任務(wù)到本地內(nèi)容的作業(yè):
{
    "job": {
        "setting": {
            "speed": {
                 "channel":1
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "root",
                        "connection": [
                            {
                                "querySql": [
                                    "select db_id,on_line_flag from db_info where db_id < 10;"
                                ],
                                "jdbcUrl": [
                                    "jdbc:mysql://bad_ip:3306/database",
                                    "jdbc:mysql://127.0.0.1:bad_port/database",
                                    "jdbc:mysql://127.0.0.1:3306/database"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "print": false,
                        "encoding": "UTF-8"
                    }
                }
            }
        ]
    }
}
  1. 參數(shù)說明
  • jdbcUrl
*   描述:描述的是到對端數(shù)據(jù)庫的JDBC連接信息,使用JSON的數(shù)組描述,并支持一個(gè)庫填寫多個(gè)連接地址。之所以使用JSON數(shù)組描述連接信息,是因?yàn)榘⒗锛瘓F(tuán)內(nèi)部支持多個(gè)IP探測,如果配置了多個(gè),MysqlReader可以依次探測ip的可連接性,直到選擇一個(gè)合法的IP。如果全部連接失敗,MysqlReader報(bào)錯(cuò)。 注意,jdbcUrl必須包含在connection配置單元中。對于阿里集團(tuán)外部使用情況,JSON數(shù)組填寫一個(gè)JDBC連接即可。

    jdbcUrl按照Mysql官方規(guī)范,并可以填寫連接附件控制信息。具體請參看[Mysql官方文檔](http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)。

*   必選:是 

*   默認(rèn)值:無

  • username
描述:數(shù)據(jù)源的用戶名 

必選:是 

默認(rèn)值:無 
  • password
描述:數(shù)據(jù)源指定用戶名的密碼 

必選:是 

默認(rèn)值:無 
  • table
描述:所選取的需要同步的表。使用JSON的數(shù)組描述,因此支持多張表同時(shí)抽取。當(dāng)配置為多張表時(shí),用戶自己需保證多張表是同一schema結(jié)構(gòu),MysqlReader不予檢查表是否同一邏輯表。注意,table必須包含在connection配置單元中。

必選:是 

默認(rèn)值:無 
  • column
描述:所配置的表中需要同步的列名集合,使用JSON的數(shù)組描述字段信息。用戶使用*代表默認(rèn)使用所有列配置,例如['*']。

支持列裁剪,即列可以挑選部分列進(jìn)行導(dǎo)出。

支持列換序,即列可以不按照表schema信息進(jìn)行導(dǎo)出。

支持常量配置,用戶需要按照Mysql SQL語法格式: ["id", "`table`", "1", "'bazhen.csy'", "null", "to_char(a + 1)", "2.3" , "true"] id為普通列名,`table`為包含保留在的列名,1為整形數(shù)字常量,'bazhen.csy'為字符串常量,null為空指針,to_char(a + 1)為表達(dá)式,2.3為浮點(diǎn)數(shù),true為布爾值。

必選:是 

默認(rèn)值:無 
  • splitPk
描述:MysqlReader進(jìn)行數(shù)據(jù)抽取時(shí),如果指定splitPk,表示用戶希望使用splitPk代表的字段進(jìn)行數(shù)據(jù)分片,DataX因此會(huì)啟動(dòng)并發(fā)任務(wù)進(jìn)行數(shù)據(jù)同步,這樣可以大大提供數(shù)據(jù)同步的效能。

推薦splitPk用戶使用表主鍵,因?yàn)楸碇麈I通常情況下比較均勻,因此切分出來的分片也不容易出現(xiàn)數(shù)據(jù)熱點(diǎn)。

 目前splitPk僅支持整形數(shù)據(jù)切分,不支持浮點(diǎn)、字符串、日期等其他類型。如果用戶指定其他非支持類型,MysqlReader將報(bào)錯(cuò)!

如果splitPk不填寫,包括不提供splitPk或者splitPk值為空,DataX視作使用單通道同步該表數(shù)據(jù)。

必選:否 

默認(rèn)值:空 
  • where
描述:篩選條件,MysqlReader根據(jù)指定的column、table、where條件拼接SQL,并根據(jù)這個(gè)SQL進(jìn)行數(shù)據(jù)抽取。在實(shí)際業(yè)務(wù)場景中,往往會(huì)選擇當(dāng)天的數(shù)據(jù)進(jìn)行同步,可以將where條件指定為gmt_create > $bizdate 。注意:不可以將where條件指定為limit 10,limit不是SQL的合法where子句。

where條件可以有效地進(jìn)行業(yè)務(wù)增量同步。如果不填寫where語句,包括不提供where的key或者value,DataX均視作同步全量數(shù)據(jù)。
必選:否 

默認(rèn)值:無 
  • querySql
描述:在有些業(yè)務(wù)場景下,where這一配置項(xiàng)不足以描述所篩選的條件,用戶可以通過該配置型來自定義篩選SQL。當(dāng)用戶配置了這一項(xiàng)之后,DataX系統(tǒng)就會(huì)忽略table,column這些配置型,直接使用這個(gè)配置項(xiàng)的內(nèi)容對數(shù)據(jù)進(jìn)行篩選,例如需要進(jìn)行多表join后同步數(shù)據(jù),使用select a,b from table_a join table_b on table_a.id = table_b.id 
當(dāng)用戶配置querySql時(shí),MysqlReader直接忽略table、column、where條件的配置,querySql優(yōu)先級(jí)大于table、column、where選項(xiàng)。

必選:否 

默認(rèn)值:無 
  1. 類型轉(zhuǎn)換
    目前MysqlReader支持大部分Mysql類型,但也存在部分個(gè)別類型沒有支持的情況,請注意檢查你的類型。
    下面列出MysqlReader針對Mysql類型轉(zhuǎn)換列表:


    列表
請注意:
除上述羅列字段類型外,其他類型均不支持。
tinyint(1) DataX視作為整形。
year DataX視作為字符串類型
bit DataX屬于未定義行為。

約束限制


  1. 主備同步數(shù)據(jù)恢復(fù)問題
    主備同步問題指Mysql使用主從災(zāi)備,備庫從主庫不間斷通過binlog恢復(fù)數(shù)據(jù)。由于主備數(shù)據(jù)同步存在一定的時(shí)間差,特別在于某些特定情況,例如網(wǎng)絡(luò)延遲等問題,導(dǎo)致備庫同步恢復(fù)的數(shù)據(jù)與主庫有較大差別,導(dǎo)致從備庫同步的數(shù)據(jù)不是一份當(dāng)前時(shí)間的完整鏡像。
    針對這個(gè)問題,我們提供了preSql功能,該功能待補(bǔ)充。

  2. 一致性約束
    Mysql在數(shù)據(jù)存儲(chǔ)劃分中屬于RDBMS系統(tǒng),對外可以提供強(qiáng)一致性數(shù)據(jù)查詢接口。例如當(dāng)一次同步任務(wù)啟動(dòng)運(yùn)行過程中,當(dāng)該庫存在其他數(shù)據(jù)寫入方寫入數(shù)據(jù)時(shí),MysqlReader完全不會(huì)獲取到寫入更新數(shù)據(jù),這是由于數(shù)據(jù)庫本身的快照特性決定的。關(guān)于數(shù)據(jù)庫快照特性,請參看MVCC Wikipedia
    上述是在MysqlReader單線程模型下數(shù)據(jù)同步一致性的特性,由于MysqlReader可以根據(jù)用戶配置信息使用了并發(fā)數(shù)據(jù)抽取,因此不能嚴(yán)格保證數(shù)據(jù)一致性:當(dāng)MysqlReader根據(jù)splitPk進(jìn)行數(shù)據(jù)切分后,會(huì)先后啟動(dòng)多個(gè)并發(fā)任務(wù)完成數(shù)據(jù)同步。由于多個(gè)并發(fā)任務(wù)相互之間不屬于同一個(gè)讀事務(wù),同時(shí)多個(gè)并發(fā)任務(wù)存在時(shí)間間隔。因此這份數(shù)據(jù)并不是完整的、一致的數(shù)據(jù)快照信息。
    針對多線程的一致性快照需求,在技術(shù)上目前無法實(shí)現(xiàn),只能從工程角度解決,工程化的方式存在取舍,我們提供幾個(gè)解決思路給用戶,用戶可以自行選擇:
    1) 使用單線程同步,即不再進(jìn)行數(shù)據(jù)切片。缺點(diǎn)是速度比較慢,但是能夠很好保證一致性。
    2) 關(guān)閉其他數(shù)據(jù)寫入方,保證當(dāng)前數(shù)據(jù)為靜態(tài)數(shù)據(jù),例如,鎖表、關(guān)閉備庫同步等等。缺點(diǎn)是可能影響在線業(yè)務(wù)。

  3. 數(shù)據(jù)庫編碼問題
    Mysql本身的編碼設(shè)置非常靈活,包括指定編碼到庫、表、字段級(jí)別,甚至可以均不同編碼。優(yōu)先級(jí)從高到低為字段、表、庫、實(shí)例。我們不推薦數(shù)據(jù)庫用戶設(shè)置如此混亂的編碼,最好在庫級(jí)別就統(tǒng)一到UTF-8。
    MysqlReader底層使用JDBC進(jìn)行數(shù)據(jù)抽取,JDBC天然適配各類編碼,并在底層進(jìn)行了編碼轉(zhuǎn)換。因此MysqlReader不需用戶指定編碼,可以自動(dòng)獲取編碼并轉(zhuǎn)碼。
    對于Mysql底層寫入編碼和其設(shè)定的編碼不一致的混亂情況,MysqlReader對此無法識(shí)別,對此也無法提供解決方案,對于這類情況,導(dǎo)出有可能為亂碼。

  4. 增量數(shù)據(jù)同步
    MysqlReader使用JDBC SELECT語句完成數(shù)據(jù)抽取工作,因此可以使用SELECT...WHERE...進(jìn)行增量數(shù)據(jù)抽取,方式有多種:
    數(shù)據(jù)庫在線應(yīng)用寫入數(shù)據(jù)庫時(shí),填充modify字段為更改時(shí)間戳,包括新增、更新、刪除(邏輯刪)。對于這類應(yīng)用,MysqlReader只需要WHERE條件跟上一同步階段時(shí)間戳即可。
    對于新增流水型數(shù)據(jù),MysqlReader可以WHERE條件后跟上一階段最大自增ID即可。
    對于業(yè)務(wù)上無字段區(qū)分新增、修改數(shù)據(jù)情況,MysqlReader也無法進(jìn)行增量數(shù)據(jù)同步,只能同步全量數(shù)據(jù)。

  5. Sql安全性
    MysqlReader提供querySql語句交給用戶自己實(shí)現(xiàn)SELECT抽取語句,MysqlReader本身對querySql不做任何安全性校驗(yàn)。這塊交由DataX用戶方自己保證。

原文:https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容