1. 程式人生 > 實用技巧 >關於datax的SqlServerReader 外掛文件讀取設定

關於datax的SqlServerReader 外掛文件讀取設定

SqlServerReader 外掛文件


1 快速介紹

SqlServerReader外掛實現了從SqlServer讀取資料。在底層實現上,SqlServerReader通過JDBC連線遠端SqlServer資料庫,並執行相應的sql語句將資料從SqlServer庫中SELECT出來。

2 實現原理

簡而言之,SqlServerReader通過JDBC聯結器連線到遠端的SqlServer資料庫,並根據使用者配置的資訊生成查詢SELECT SQL語句併發送到遠端SqlServer資料庫,並將該SQL執行返回結果使用DataX自定義的資料型別拼裝為抽象的資料集,並傳遞給下游Writer處理。

對於使用者配置Table、Column、Where的資訊,SqlServerReader將其拼接為SQL語句傳送到SqlServer資料庫;對於使用者配置querySql資訊,SqlServer直接將其傳送到SqlServer資料庫。

3 功能說明

3.1 配置樣例

  • 配置一個從SqlServer資料庫同步抽取資料到本地的作業:
{
    "job": {
        "setting": {
            "speed": {
                 "byte": 1048576
            }
        },
        "content": [
            {
                "reader": {
                    "name": "sqlserverreader",
                    "parameter": {
                        // 資料庫連線使用者名稱
                        "username": "root",
                        // 資料庫連線密碼
                        "password": "root",
                        "column": [
                            "id"
                        ],
                        "splitPk": "db_id",
                        "connection": [
                            {
                                "table": [
                                    "table"
                                ],
                                "jdbcUrl": [
                                "jdbc:sqlserver://localhost:3433;DatabaseName=dbname"
                                ]
                            }
                        ]
                    }
                },
               "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "print": true,
                        "encoding": "UTF-8"
                    }
                }
            }
        ]
    }
}

  

  • 配置一個自定義SQL的資料庫同步任務到本地內容的作業:
{
    "job": {
        "setting": {
            "speed": 1048576
        },
        "content": [
            {
                "reader": {
                    "name": "sqlserverreader",
                    "parameter": {
                        "username": "root",
                        "password": "root",
                        "where": "",
                        "connection": [
                            {
                                "querySql": [
                                    "select db_id,on_line_flag from db_info where db_id < 10;"
                                ],
                                "jdbcUrl": [
                                    "jdbc:sqlserver://bad_ip:3433;DatabaseName=dbname",
                                    "jdbc:sqlserver://127.0.0.1:bad_port;DatabaseName=dbname",
                                    "jdbc:sqlserver://127.0.0.1:3306;DatabaseName=dbname"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "visible": false,
                        "encoding": "UTF-8"
                    }
                }
            }
        ]
    }
}

  

3.2 引數說明

  • jdbcUrl

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

      jdbcUrl按照SqlServer官方規範,並可以填寫連線附件控制資訊。具體請參看SqlServer官方文件

    • 必選:是

    • 預設值:無

  • username

    • 描述:資料來源的使用者名稱

    • 必選:是

    • 預設值:無

  • password

    • 描述:資料來源指定使用者名稱的密碼

    • 必選:是

    • 預設值:無

  • table

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

    • 必選:是

    • 預設值:無

  • column

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

      支援列裁剪,即列可以挑選部分列進行匯出。

      支援列換序,即列可以不按照表schema資訊進行匯出。

      支援常量配置,使用者需要按照JSON格式: ["id", "[table]", "1", "'bazhen.csy'", "null", "COUNT(*)", "2.3" , "true"] id為普通列名,[table]為包含保留在的列名,1為整形數字常量,'bazhen.csy'為字串常量,null為空指標,to_char(a + 1)為表示式,2.3為浮點數,true為布林值。

      column必須使用者顯示指定同步的列集合,不允許為空!

    • 必選:是

    • 預設值:無

  • splitPk

    • 描述:SqlServerReader進行資料抽取時,如果指定splitPk,表示使用者希望使用splitPk代表的欄位進行資料分片,DataX因此會啟動併發任務進行資料同步,這樣可以大大提供資料同步的效能。

      推薦splitPk使用者使用表主鍵,因為表主鍵通常情況下比較均勻,因此切分出來的分片也不容易出現數據熱點。

      目前splitPk僅支援整形型資料切分,不支援浮點、字串、日期等其他型別。如果使用者指定其他非支援型別,SqlServerReader將報錯!

      splitPk設定為空,底層將視作使用者不允許對單表進行切分,因此使用單通道進行抽取。

    • 必選:否

    • 預設值:無

  • where

    • 描述:篩選條件,MysqlReader根據指定的column、table、where條件拼接SQL,並根據這個SQL進行資料抽取。在實際業務場景中,往往會選擇當天的資料進行同步,可以將where條件指定為gmt_create > $bizdate 。注意:不可以將where條件指定為limit 10,limit不是SQL的合法where子句。

      where條件可以有效地進行業務增量同步。如果該值為空,代表同步全表所有的資訊。
      
    • 必選:否

    • 預設值:無

  • querySql

    • 描述:在有些業務場景下,where這一配置項不足以描述所篩選的條件,使用者可以通過該配置型來自定義篩選SQL。當用戶配置了這一項之後,DataX系統就會忽略table,column這些配置型,直接使用這個配置項的內容對資料進行篩選,例如需要進行多表join後同步資料,使用select a,b from table_a join table_b on table_a.id = table_b.id

    當用戶配置querySql時,SqlServerReader直接忽略table、column、where條件的配置

    • 必選:否

    • 預設值:無

  • fetchSize

    • 描述:該配置項定義了外掛和資料庫伺服器端每次批量資料獲取條數,該值決定了DataX和伺服器端的網路互動次數,能夠較大的提升資料抽取效能。

    注意,該值過大(>2048)可能造成DataX程序OOM。

    • 必選:否

    • 預設值:1024

3.3 型別轉換

目前SqlServerReader支援大部分SqlServer型別,但也存在部分個別型別沒有支援的情況,請注意檢查你的型別。

下面列出SqlServerReader針對SqlServer型別轉換列表:

DataX 內部型別SqlServer 資料型別
Long bigint, int, smallint, tinyint
Double float, decimal, real, numeric
String char,nchar,ntext,nvarchar,text,varchar,nvarchar(MAX),varchar(MAX)
Date date, datetime, time
Boolean bit
Bytes binary,varbinary,varbinary(MAX),timestamp

請注意:

  • 除上述羅列欄位型別外,其他型別均不支援
  • timestamp型別作為二進位制型別

4 效能報告

暫無

5 約束限制

5.1 主備同步資料恢復問題

主備同步問題指SqlServer使用主從災備,備庫從主庫不間斷通過binlog恢復資料。由於主備資料同步存在一定的時間差,特別在於某些特定情況,例如網路延遲等問題,導致備庫同步恢復的資料與主庫有較大差別,導致從備庫同步的資料不是一份當前時間的完整映象。

針對這個問題,我們提供了preSql功能,該功能待補充。

5.2 一致性約束

SqlServer在資料儲存劃分中屬於RDBMS系統,對外可以提供強一致性資料查詢介面。例如當一次同步任務啟動執行過程中,當該庫存在其他資料寫入方寫入資料時,SqlServerReader完全不會獲取到寫入更新資料,這是由於資料庫本身的快照特性決定的。關於資料庫快照特性,請參看MVCC Wikipedia

上述是在SqlServerReader單執行緒模型下資料同步一致性的特性,由於SqlServerReader可以根據使用者配置資訊使用了併發資料抽取,因此不能嚴格保證資料一致性:當SqlServerReader根據splitPk進行資料切分後,會先後啟動多個併發任務完成資料同步。由於多個併發任務相互之間不屬於同一個讀事務,同時多個併發任務存在時間間隔。因此這份資料並不是完整的一致的資料快照資訊。

針對多執行緒的一致性快照需求,在技術上目前無法實現,只能從工程角度解決,工程化的方式存在取捨,我們提供幾個解決思路給使用者,使用者可以自行選擇:

  1. 使用單執行緒同步,即不再進行資料切片。缺點是速度比較慢,但是能夠很好保證一致性。

  2. 關閉其他資料寫入方,保證當前資料為靜態資料,例如,鎖表、關閉備庫同步等等。缺點是可能影響線上業務。

5.3 資料庫編碼問題

SqlServerReader底層使用JDBC進行資料抽取,JDBC天然適配各類編碼,並在底層進行了編碼轉換。因此SqlServerReader不需使用者指定編碼,可以自動識別編碼並轉碼。

5.4 增量資料同步

SqlServerReader使用JDBC SELECT語句完成資料抽取工作,因此可以使用SELECT...WHERE...進行增量資料抽取,方式有多種:

  • 資料庫線上應用寫入資料庫時,填充modify欄位為更改時間戳,包括新增、更新、刪除(邏輯刪)。對於這類應用,SqlServerReader只需要WHERE條件跟上一同步階段時間戳即可。
  • 對於新增流水型資料,SqlServerReader可以WHERE條件後跟上一階段最大自增ID即可。

對於業務上無欄位區分新增、修改資料情況,SqlServerReader也無法進行增量資料同步,只能同步全量資料。

5.5 Sql安全性

SqlServerReader提供querySql語句交給使用者自己實現SELECT抽取語句,SqlServerReader本身對querySql不做任何安全性校驗。這塊交由DataX使用者方自己保證。

6 FAQ