DataX SqlServerWriter手冊參數


DataX SqlServerWriter


1 快速介紹

SqlServerWriter 插件實現了寫入數據到 SqlServer 庫的目的表的功能。在底層實現上, SqlServerWriter 通過 JDBC 連接遠程 SqlServer 數據庫,並執行相應的 insert into ... sql 語句將數據寫入 SqlServer,內部會分批次提交入庫。

SqlServerWriter 面向ETL開發工程師,他們使用 SqlServerWriter 從數倉導入數據到 SqlServer。同時 SqlServerWriter 亦可以作為數據遷移工具為DBA等用戶提供服務。

2 實現原理

SqlServerWriter 通過 DataX 框架獲取 Reader 生成的協議數據,根據你配置生成相應的SQL語句

  • insert into...(當主鍵/唯一性索引沖突時會寫不進去沖突的行)

 

注意:
1. 目的表所在數據庫必須是主庫才能寫入數據;整個任務至少需具備 insert into...的權限,是否需要其他權限,取決於你任務配置中在 preSql 和 postSql 中指定的語句。
2.SqlServerWriter和MysqlWriter不同,不支持配置writeMode參數。

3 功能說明

3.1 配置樣例

  • 這里使用一份從內存產生到 SqlServer 導入的數據。
{
    "job": {
        "setting": {
            "speed": {
                "channel": 5
            }
        },
        "content": [
            {
                "reader": {},
                "writer": {
                    "name": "sqlserverwriter",
                    "parameter": {
                        "username": "root",
                        "password": "root",
                        "column": [
                            "db_id",
                            "db_type",
                            "db_ip",
                            "db_port",
                            "db_role",
                            "db_name",
                            "db_username",
                            "db_password",
                            "db_modify_time",
                            "db_modify_user",
                            "db_description",
                            "db_tddl_info"
                        ],
                        "connection": [
                            {
                                "table": [
                                    "db_info_for_writer"
                                ],
                                "jdbcUrl": "jdbc:sqlserver://[HOST_NAME]:PORT;DatabaseName=[DATABASE_NAME]"
                            }
                        ],
                        "preSql": [
                            "delete from @table where db_id = -1;"
                        ],
                        "postSql": [
                            "update @table set db_modify_time = now() where db_id = 1;"
                        ]
                    }
                }
            }
        ]
    }
}

3.2 參數說明

  • jdbcUrl

    • 描述:目的數據庫的 JDBC 連接信息 ,jdbcUrl必須包含在connection配置單元中。

           注意:1、在一個數據庫上只能配置一個值。這與 SqlServerReader 支持多個備庫探測不同,因為此處不支持同一個數據庫存在多個主庫的情況(雙主導入數據情況)
                2、jdbcUrl按照SqlServer官方規范,並可以填寫連接附加參數信息。具體請參看 SqlServer官方文檔或者咨詢對應 DBA。
      
    • 必選:是

    • 默認值:無

  • username

    • 描述:目的數據庫的用戶名

    • 必選:是

    • 默認值:無

  • password

    • 描述:目的數據庫的密碼

    • 必選:是

    • 默認值:無

  • table

    • 描述:目的表的表名稱。支持寫入一個或者多個表。當配置為多張表時,必須確保所有表結構保持一致。

             注意:table 和 jdbcUrl 必須包含在 connection 配置單元中
      
    • 必選:是

    • 默認值:無

  • column

    • 描述:目的表需要寫入數據的字段,字段之間用英文逗號分隔。例如: "column": ["id","name","age"]。如果要依次寫入全部列,使用表示, 例如: "column": [""]

      	**column配置項必須指定,不能留空!**
      
      
             注意:1、我們強烈不推薦你這樣配置,因為當你目的表字段個數、類型等有改動時,你的任務可能運行不正確或者失敗
                  2、此處 column 不能配置任何常量值
      
    • 必選:是

    • 默認值:否

  • preSql

    • 描述:寫入數據到目的表前,會先執行這里的標准語句。如果 Sql 中有你需要操作到的表名稱,請使用 @table 表示,這樣在實際執行 Sql 語句時,會對變量按照實際表名稱進行替換。

    • 必選:否

    • 默認值:無

  • postSql

    • 描述:寫入數據到目的表后,會執行這里的標准語句。(原理同 preSql )

    • 必選:否

    • 默認值:無

  • batchSize

    • 描述:一次性批量提交的記錄數大小,該值可以極大減少DataX與SqlServer的網絡交互次數,並提升整體吞吐量。但是該值設置過大可能會造成DataX運行進程OOM情況。

    • 必選:否

    • 默認值:1024

3.3 類型轉換

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

下面列出 SqlServerWriter 針對 SqlServer 類型轉換列表:

DataX 內部類型 SqlServer 數據類型
Long  
Double  
String  
Date  
Boolean  
Bytes  

4 性能報告

4.1 環境准備

4.1.1 數據特征

建表語句:


單行記錄類似於:

4.1.2 機器參數

  • 執行 DataX 的機器參數為:

    1. cpu: 24 Core Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz
    2. mem: 94GB
    3. net: 千兆雙網卡
    4. disc: DataX 數據不落磁盤,不統計此項
  • SqlServer 數據庫機器參數為:

    1. cpu: 4 Core Intel(R) Xeon(R) CPU E5420 @ 2.50GHz
    2. mem: 7GB

4.1.3 DataX jvm 參數

-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError

4.1.4 性能測試作業配置


4.2 測試報告

4.2.1 測試報告

5 約束限制

FAQ


Q: SqlServerWriter 執行 postSql 語句報錯,那么數據導入到目標數據庫了嗎?

A: DataX 導入過程存在三塊邏輯,pre 操作、導入操作、post 操作,其中任意一環報錯,DataX 作業報錯。由於 DataX 不能保證在同一個事務完成上述幾個操作,因此有可能數據已經落入到目標端。


Q: 按照上述說法,那么有部分臟數據導入數據庫,如果影響到線上數據庫怎么辦?

A: 目前有兩種解法,第一種配置 pre 語句,該 sql 可以清理當天導入數據, DataX 每次導入時候可以把上次清理干凈並導入完整數據。第二種,向臨時表導入數據,完成后再 rename 到線上表。


Q: 上面第二種方法可以避免對線上數據造成影響,那我具體怎樣操作?

A: 可以配置臨時表導入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM