SQL Server數(shù)據(jù)源
SQL Server數(shù)據(jù)源為您提供讀取和寫入SQL Server雙向通道的功能,本文為您介紹DataWorks的SQL Server數(shù)據(jù)同步的能力支持情況。
支持的版本
SQL Server Reader使用驅(qū)動(dòng)版本是com.microsoft.sqlserver sqljdbc4 4.0,驅(qū)動(dòng)能力具體請(qǐng)參見官網(wǎng)文檔。該驅(qū)動(dòng)支持的SQL Server版本如下所示:
版本 | 支持性(是/否) |
SQL Server 2016 | 是 |
SQL Server 2014 | 是 |
SQL Server 2012 | 是 |
PDW 2008R2 AU34 | 是 |
SQL Server 2008 R2 | 是 |
SQL Server 2008 | 是 |
SQL Server 2019 | 否 |
SQL Server 2018 | 否 |
Azure SQL Managed Instance | 否 |
Azure Synapse Analytics | 否 |
Azure SQL Database | 是 |
使用限制
離線同步支持讀取視圖表。
支持的字段類型
SQL Server全量的字段類型請(qǐng)參見SQL Server幫助文檔。以下以SQL Server 2016為例,為您列舉常見的字段類型的支持情況。
sql server 2016字段類型 | SQL Server Reader | SQL Server Writer |
bigint | 支持 | 支持 |
bit | 支持 | 支持 |
decimal | 支持 | 支持 |
int | 支持 | 支持 |
money | 支持 | 支持 |
numeric | 支持 | 支持 |
smallint | 支持 | 支持 |
smallmoney | 支持 | 支持 |
tinyint | 支持 | 支持 |
float | 支持 | 支持 |
real | 支持 | 支持 |
date | 支持 | 支持 |
datetime2 | 支持 | 支持 |
datetime | 支持 | 支持 |
datetimeoffset | 不支持 | 不支持 |
smalldatetime | 支持 | 支持 |
time | 支持 | 支持 |
char | 支持 | 支持 |
text | 支持 | 支持 |
varchar | 支持 | 支持 |
nchar | 支持 | 支持 |
ntext | 支持 | 支持 |
nvarchar | 支持 | 支持 |
binary | 支持 | 支持 |
image | 支持 | 支持 |
varbinary | 支持 | 支持 |
cursor | 不支持 | 不支持 |
hierarchyid | 不支持 | 不支持 |
sql_variant | 支持 | 支持 |
Spatial Geometry Types | 不支持 | 不支持 |
table | 不支持 | 不支持 |
rowversion | 不支持 | 不支持 |
uniqueidentifier | 支持 | 支持 |
xml | 支持 | 支持 |
Spatial Geography Types | 不支持 | 不支持 |
SQL Server Reader和SQL Server Writer針對(duì)SQL Server的類型轉(zhuǎn)換列表,如下所示。
類型分類 | SQL Server數(shù)據(jù)類型 |
整數(shù)類 | BIGINT、INT、SMALLINT和TINYINT |
浮點(diǎn)類 | FLOAT、DECIMAL、REAL和NUMERIC |
字符串類 | CHAR、NCHAR、NTEXT、NVARCHAR、TEXT、VARCHAR、NVARCHAR(MAX)和VARCHAR(MAX) |
日期時(shí)間類 | DATE、DATETIME和TIME |
布爾型 | BIT |
二進(jìn)制類 | BINARY、VARBINARY、VARBINARY(MAX)和TIMESTAMP |
創(chuàng)建數(shù)據(jù)源
在進(jìn)行數(shù)據(jù)同步任務(wù)開發(fā)時(shí),您需要在DataWorks上創(chuàng)建一個(gè)對(duì)應(yīng)的數(shù)據(jù)源,操作流程請(qǐng)參見創(chuàng)建并管理數(shù)據(jù)源,詳細(xì)的配置參數(shù)解釋可在配置界面查看對(duì)應(yīng)參數(shù)的文案提示。
數(shù)據(jù)同步任務(wù)開發(fā)
數(shù)據(jù)同步任務(wù)的配置入口和通用配置流程可參見下文的配置指導(dǎo)。
單表離線同步任務(wù)配置指導(dǎo)
操作流程請(qǐng)參見通過(guò)向?qū)J脚渲秒x線同步任務(wù)、通過(guò)腳本模式配置離線同步任務(wù)。
腳本模式配置的全量參數(shù)和腳本Demo請(qǐng)參見下文的附錄:腳本Demo與參數(shù)說(shuō)明。
整庫(kù)離線讀同步任務(wù)配置指導(dǎo)
操作流程請(qǐng)參見數(shù)據(jù)集成側(cè)同步任務(wù)配置。
常見問(wèn)題
主備同步數(shù)據(jù)恢復(fù)問(wèn)題
主備同步問(wèn)題指SQL Server使用主從災(zāi)備,備庫(kù)從主庫(kù)不間斷通過(guò)binlog恢復(fù)數(shù)據(jù)。由于主備數(shù)據(jù)同步存在一定的時(shí)間差,特別在于某些特定情況,例如網(wǎng)絡(luò)延遲等問(wèn)題,導(dǎo)致備庫(kù)同步恢復(fù)的數(shù)據(jù)與主庫(kù)有較大差別,從備庫(kù)同步的數(shù)據(jù)不是一份當(dāng)前時(shí)間的完整鏡像。
一致性約束
SQL Server在數(shù)據(jù)存儲(chǔ)劃分中屬于RDBMS系統(tǒng),對(duì)外可以提供強(qiáng)一致性數(shù)據(jù)查詢接口。例如一次同步任務(wù)啟動(dòng)運(yùn)行過(guò)程中,當(dāng)該庫(kù)存在其他數(shù)據(jù)寫入方寫入數(shù)據(jù)時(shí),由于數(shù)據(jù)庫(kù)本身的快照特性,SQL Server Reader完全不會(huì)獲取到寫入的更新數(shù)據(jù)。
上述是在SQL Server Reader單線程模型下數(shù)據(jù)同步一致性的特性,SQL Server Reader可以根據(jù)您配置的信息使用并發(fā)數(shù)據(jù)抽取,因此不能嚴(yán)格保證數(shù)據(jù)一致性。
當(dāng)SQL Server Reader根據(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ù)快照信息。
針對(duì)多線程的一致性快照需求,目前在技術(shù)上無(wú)法實(shí)現(xiàn),只能從工程角度解決。工程化的方式存在取舍,在此提供以下解決思路,您可以根據(jù)自身情況進(jìn)行選擇。
使用單線程同步,即不再進(jìn)行數(shù)據(jù)切片。缺點(diǎn)是速度比較慢,但是能夠很好保證一致性。
關(guān)閉其他數(shù)據(jù)寫入方,保證當(dāng)前數(shù)據(jù)為靜態(tài)數(shù)據(jù),例如鎖表、關(guān)閉備庫(kù)同步等。缺點(diǎn)是可能影響在線業(yè)務(wù)。
數(shù)據(jù)庫(kù)編碼問(wèn)題
SQL Server Reader底層使用JDBC進(jìn)行數(shù)據(jù)抽取,JDBC天然適配各類編碼,并在底層進(jìn)行了編碼轉(zhuǎn)換。因此SQL Server Reader不需您指定編碼,可以自動(dòng)獲取編碼并轉(zhuǎn)碼。
增量數(shù)據(jù)同步的方式
SQL Server Reader使用JDBC SELECT語(yǔ)句完成數(shù)據(jù)抽取工作,因此您可以使用
SELECT…WHERE…
進(jìn)行增量數(shù)據(jù)抽取,方式如下:數(shù)據(jù)庫(kù)在線應(yīng)用寫入數(shù)據(jù)庫(kù)時(shí),填充modify字段為更改時(shí)間戳,包括新增、更新、刪除(邏輯刪除)。對(duì)于該類應(yīng)用,SQL Server Reader只需要where條件后跟上一同步階段時(shí)間戳即可。
對(duì)于新增流水型數(shù)據(jù),SQL Server Reader在where條件后跟上一階段最大自增ID即可。
對(duì)于業(yè)務(wù)上無(wú)字段區(qū)分新增、修改數(shù)據(jù)的情況,SQL Server Reader無(wú)法進(jìn)行增量數(shù)據(jù)同步,只能同步全量數(shù)據(jù)。
SQL安全性
SQL Server Reader提供querySql語(yǔ)句交給您自己實(shí)現(xiàn)SELECT抽取語(yǔ)句,SQL Server Reader本身對(duì)querySql不進(jìn)行任何安全性校驗(yàn)。
附錄:腳本Demo與參數(shù)說(shuō)明
離線任務(wù)腳本配置方式
如果您配置離線任務(wù)時(shí)使用腳本模式的方式進(jìn)行配置,您需要按照統(tǒng)一的腳本格式要求,在任務(wù)腳本中編寫相應(yīng)的參數(shù),詳情請(qǐng)參見通過(guò)腳本模式配置離線同步任務(wù),以下為您介紹腳本模式下數(shù)據(jù)源的參數(shù)配置詳情。
Reader腳本Demo
{
"type":"job",
"version":"2.0",//版本號(hào)。
"steps":[
{
"stepType":"sqlserver",//插件名。
"parameter":{
"datasource":"",//數(shù)據(jù)源。
"column":[//字段。
"id",
"name"
],
"where":"",//篩選條件。
"splitPk":"",//如果指定splitPk,表示您希望使用splitPk代表的字段進(jìn)行數(shù)據(jù)分片。
"table":""http://數(shù)據(jù)表。
},
"name":"Reader",
"category":"reader"
},
{
"stepType":"stream",
"parameter":{},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"http://錯(cuò)誤記錄數(shù)。
},
"speed":{
"throttle":true,//當(dāng)throttle值為false時(shí),mbps參數(shù)不生效,表示不限流;當(dāng)throttle值為true時(shí),表示限流。
"concurrent":1 //作業(yè)并發(fā)數(shù)。
"mbps":"12",//限流,此處1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
如果您想使用querySql查詢,Reader部分腳本代碼示例如下(SQL Server數(shù)據(jù)源是sql_server_source,待查詢的表是dbo.test_table,待查詢的列是name)。
{
"stepType": "sqlserver",
"parameter": {
"querySql": "select name from dbo.test_table",
"datasource": "sql_server_source",
"column": [
"name"
],
"where": "",
"splitPk": "id"
},
"name": "Reader",
"category": "reader"
},
Reader腳本參數(shù)
參數(shù) | 描述 | 是否必選 | 默認(rèn)值 |
datasource | 數(shù)據(jù)源名稱,腳本模式支持添加數(shù)據(jù)源,該配置項(xiàng)填寫的內(nèi)容必須要與添加的數(shù)據(jù)源名稱保持一致。 | 是 | 無(wú) |
table | 選取的需要同步的表名稱,一個(gè)作業(yè)只能支持一個(gè)表同步。 | 是 | 無(wú) |
column | 所配置的表中需要同步的列名集合,使用JSON的數(shù)組描述字段信息 。默認(rèn)使用所有列配置,例如[ * ]。
| 是 | 無(wú) |
splitPk | SQL Server Reader進(jìn)行數(shù)據(jù)抽取時(shí),如果指定splitPk,表示您希望使用splitPk代表的字段進(jìn)行數(shù)據(jù)分片。數(shù)據(jù)同步系統(tǒng)因此會(huì)啟動(dòng)并發(fā)任務(wù)進(jìn)行數(shù)據(jù)同步,這樣可以提高數(shù)據(jù)同步的效能。
| 否 | 無(wú) |
where | 篩選條件,SQL Server Reader根據(jù)指定的column、table和where條件拼接SQL,并根據(jù)該SQL進(jìn)行數(shù)據(jù)抽取。例如在測(cè)試時(shí),可以將where條件指定為limit 10。在實(shí)際業(yè)務(wù)場(chǎng)景中,往往會(huì)選擇當(dāng)天的數(shù)據(jù)進(jìn)行同步,將where條件指定為
| 否 | 無(wú) |
querySql | 使用格式: | 否 | 無(wú) |
fetchSize | 該配置項(xiàng)定義了插件和數(shù)據(jù)庫(kù)服務(wù)器端每次批量數(shù)據(jù)獲取條數(shù),該值決定了數(shù)據(jù)集成和服務(wù)器端的網(wǎng)絡(luò)交互次數(shù),能夠提升數(shù)據(jù)抽取性能。 說(shuō)明 fetchSize值過(guò)大(>2048)可能造成數(shù)據(jù)同步進(jìn)程OOM。 | 否 | 1024 |
對(duì)于您配置的table、column和where等信息,SQL Server Reader將其拼接為SQL語(yǔ)句發(fā)送至SQL Server數(shù)據(jù)庫(kù)。
對(duì)于您配置的querySql信息,SQL Server直接將其發(fā)送至SQL Server數(shù)據(jù)庫(kù)。
Writer腳本Demo
{
"type":"job",
"version":"2.0",//版本號(hào)。
"steps":[
{
"stepType":"stream",
"parameter":{},
"name":"Reader",
"category":"reader"
},
{
"stepType":"sqlserver",//插件名。
"parameter":{
"postSql":[],//執(zhí)行數(shù)據(jù)同步任務(wù)之后率先執(zhí)行的SQL語(yǔ)句。
"datasource":"",//數(shù)據(jù)源。
"column":[//字段。
"id",
"name"
],
"table":"",//表名。
"preSql":[]//執(zhí)行數(shù)據(jù)同步任務(wù)之前率先執(zhí)行的SQL語(yǔ)句。
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"http://錯(cuò)誤記錄數(shù)。
},
"speed":{
"throttle":true,//當(dāng)throttle值為false時(shí),mbps參數(shù)不生效,表示不限流;當(dāng)throttle值為true時(shí),表示限流。
"concurrent":1, //作業(yè)并發(fā)數(shù)。
"mbps":"12"http://限流,此處1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
Writer腳本參數(shù)
參數(shù) | 描述 | 是否必選 | 默認(rèn)值 |
datasource | 數(shù)據(jù)源名稱,腳本模式支持添加數(shù)據(jù)源,此配置項(xiàng)填寫的內(nèi)容必須要與添加的數(shù)據(jù)源名稱保持一致。 | 是 | 無(wú) |
table | 選取的需要同步的表名稱。 | 是 | 無(wú) |
column | 目標(biāo)表需要寫入數(shù)據(jù)的字段,字段之間用英文逗號(hào)分隔。例如 | 是 | 無(wú) |
preSql | 執(zhí)行數(shù)據(jù)同步任務(wù)之前率先執(zhí)行的SQL語(yǔ)句。目前向?qū)J絻H允許執(zhí)行一條SQL語(yǔ)句,腳本模式可以支持多條SQL語(yǔ)句,例如清除舊數(shù)據(jù)。 | 否 | 無(wú) |
postSql | 執(zhí)行數(shù)據(jù)同步任務(wù)之后執(zhí)行的SQL語(yǔ)句。目前向?qū)J絻H允許執(zhí)行一條SQL語(yǔ)句,腳本模式可以支持多條SQL語(yǔ)句,例如加上某一個(gè)時(shí)間戳。 | 否 | 無(wú) |
writeMode | 選擇導(dǎo)入模式,可以支持insert方式。 當(dāng)主鍵/唯一性索引沖突時(shí),數(shù)據(jù)集成視為臟數(shù)據(jù)但保留原有的數(shù)據(jù)。 | 否 | insert |
batchSize | 一次性批量提交的記錄數(shù)大小,該值可以極大減少數(shù)據(jù)同步系統(tǒng)與SQL Server的網(wǎng)絡(luò)交互次數(shù),并提升整體吞吐量。如果該值設(shè)置過(guò)大,會(huì)導(dǎo)致數(shù)據(jù)同步運(yùn)行進(jìn)程OOM異常。 | 否 | 1,024 |