DataX系列5- MysqlReader介紹 一. 快速介紹 二. 實現原理 三. 功能說明 參考:

一. 快速介紹

  MysqlReader插件實現了從Mysql讀取數據。在底層實現上,MysqlReader通過JDBC連接遠程Mysql數據庫,並執行相應的sql語句將數據從mysql庫中SELECT出來。

  不同於其他關係型數據庫,MysqlReader不支持FetchSize.

二. 實現原理

  簡而言之,MysqlReader通過JDBC連接器連接到遠程的Mysql數據庫,並根據用戶配置的信息生成查詢SELECT SQL語句,然後發送到遠程Mysql數據庫,並將該SQL執行返回結果使用DataX自定義的數據類型拼裝爲抽象的數據集,並傳遞給下游Writer處理。

  對於用戶配置Table、Column、Where的信息,MysqlReader將其拼接爲SQL語句發送到Mysql數據庫;對於用戶配置querySql信息,MysqlReader直接將其發送到Mysql數據庫。

三. 功能說明

3.1 配置樣例

配置一個從Mysql數據庫同步抽取數據到本地的作業:

{
    "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
                    }
                }
            }
        ]
    }
}

配置一個自定義SQL的數據庫同步任務到本地內容的作業:

{
    "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"
                    }
                }
            }
        ]
    }
}

3.2 參數說明

3.2.1 jdbcUrl

  • 描述:描述的是到對端數據庫的JDBC連接信息,使用JSON的數組描述,並支持一個庫填寫多個連接地址。之所以使用JSON數組描述連接信息,是因爲阿里集團內部支持多個IP探測,如果配置了多個,MysqlReader可以依次探測ip的可連接性,直到選擇一個合法的IP。如果全部連接失敗,MysqlReader報錯。 注意,jdbcUrl必須包含在connection配置單元中。對於阿里集團外部使用情況,JSON數組填寫一個JDBC連接即可。

    jdbcUrl按照Mysql官方規範,並可以填寫連接附件控制信息。具體請參看Mysql官方文檔

  • 必選:是

  • 默認值:無

3.2.2 username

  • 描述:數據源的用戶名

  • 必選:是

  • 默認值:無

3.2.3 password

  • 描述:數據源指定用戶名的密碼

  • 必選:是

  • 默認值:無

3.2.4 table

  • 描述:所選取的需要同步的表。使用JSON的數組描述,因此支持多張表同時抽取。當配置爲多張表時,用戶自己需保證多張表是同一schema結構,MysqlReader不予檢查表是否同一邏輯表。注意,table必須包含在connection配置單元中。

  • 必選:是

  • 默認值:無

3.2.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爲布爾值。

  • 必選:是

  • 默認值:無

3.2.6 splitPk

  • 描述:MysqlReader進行數據抽取時,如果指定splitPk,表示用戶希望使用splitPk代表的字段進行數據分片,DataX因此會啓動併發任務進行數據同步,這樣可以大大提供數據同步的效能。
    推薦splitPk用戶使用表主鍵,因爲表主鍵通常情況下比較均勻,因此切分出來的分片也不容易出現數據熱點。
    目前splitPk僅支持整形數據切分,不支持浮點、字符串、日期等其他類型。如果用戶指定其他非支持類型,MysqlReader將報錯!
    如果splitPk不填寫,包括不提供splitPk或者splitPk值爲空,DataX視作使用單通道同步該表數據。

  • 必選:否

  • 默認值:空

3.2.7 where

  • 描述:篩選條件,MysqlReader根據指定的column、table、where條件拼接SQL,並根據這個SQL進行數據抽取。在實際業務場景中,往往會選擇當天的數據進行同步,可以將where條件指定爲gmt_create > $bizdate 。注意:不可以將where條件指定爲limit 10,limit不是SQL的合法where子句。
    where條件可以有效地進行業務增量同步。如果不填寫where語句,包括不提供where的key或者value,DataX均視作同步全量數據。

  • 必選:否

  • 默認值:無

3.2.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選項。

  • 必選:否

  • 默認值:無

3.3 類型轉換

  目前MysqlReader支持大部分Mysql類型,但也存在部分個別類型沒有支持的情況,請注意檢查你的類型。

下面列出MysqlReader針對Mysql類型轉換列表:

請注意:

  1. 除上述羅列字段類型外,其他類型均不支持。
  2. tinyint(1) DataX視作爲整形。
  3. year DataX視作爲字符串類型
  4. bit DataX屬於未定義行爲。

參考:

  1. https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章