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 的機器參數為:
- cpu: 24 Core Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz
- mem: 94GB
- net: 千兆雙網卡
- disc: DataX 數據不落磁盤,不統計此項
-
SqlServer 數據庫機器參數為:
- cpu: 4 Core Intel(R) Xeon(R) CPU E5420 @ 2.50GHz
- 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: 可以配置臨時表導入
