標籤:style blog http color io os 使用 ar for
SQL Server自訂業務功能的資料同步
在不同業務需求的驅動下,資料庫的模組化拆分將會面臨一些比較特殊的商務邏輯處理需求。例如,在資料庫層面的資料同步需求。同步過程中,可能會有一些比較複雜的商務邏輯判斷。簡單介紹幾個SQL Server提供的資料同步功能。
- 已連結服務(Linked Server)
通過連結資料庫可以實現不同執行個體間資料的訪問和更新操作。通常會與OPENQUERY行集合函式一起使用,以避免分散式交易的幹涉。不建議直接使用已連結服務來做遠端資料的更新操作,因為這需要使用到分散式資料庫的交易管理。SQL Server的分散式交易需要通過Windows的DTC(Distributed Transaction Controller,分散式交易控制器)來管理和協調不同伺服器,或者說不同資料庫執行個體間的資源和事務調整,其效能與普通的交易管理成幾何倍的增長。
10-4,頁面是已連結服務的配置介面,可以通過SSMS的Server Objects中的Linked Servers可視化頁面來進行配置。
圖11-4 資料庫的已連結服務
Provider是已連結的伺服器串連資料庫時使用的適配器的類型,11-4中,左邊部分顯示的,列出了幾趾已有的適配器的類型。樣本中,使用SQLOLEDB類型的適配器進行資料庫連接。
Security頁用來配置連結的伺服器的驗證資訊,它包括11-5中所示的4種模式的驗證方式。
Not be made
當選擇此認證模式時,已連結服務將使用本地服務的登陸使用者與遠程服務登陸使用者的映射配置列表中的帳號。中,當選擇此模式時,本地將只能使用sa登陸時,類比遠程服務的sa帳號的許可權配置。
Without using a Security context
選擇此模式將不使用驗證模式,它只利用SQL Server服務的登陸帳號進行驗證,此服務需求在Windows服務啟動時,本地服務和遠程服務使用相同的登陸帳號。
Using current security context
當使用此模式時,要求本地和遠程服務都要有相同的帳號及密碼,通常這些配置為Windows整合認證的時候使用。
Using this security context
使用此模式時,將使用下面配置的使用者和密碼進行登陸遠程服務。
本小節中只是簡略地介紹了關於這些配置的簡要步驟,要擷取更詳細的內容,請參考SQL Server聯機叢書(http://technet.microsoft.com/zh-cn/library/ff772782.aspx)。
圖11-5 連結的伺服器安全配置
- 變更追蹤(Change Tracking)
變更追蹤是SQL Server 2008加入的一個輕量級的資料修改記錄功能,它是資料變更捕獲功能的縮減版本。它可以將已修改資料的主鍵記錄在對應的視圖中,而後通過系統函數訪問該視圖,獲得相應的變更資料。通過變更資料的記錄,可以實現增量地處理複雜的商務邏輯,而後將資料結果儲存到目標資料庫中。
範例程式碼如代碼清單11-1中所示,開啟變更追蹤是依據表來配置的,但是在配置表的變更追蹤之前,需要將資料庫的變更追蹤選項開啟,開啟資料庫變更追蹤選項時,預設會將變更追蹤記錄保留2天,並開啟自動清理的選項。
變更追蹤可以跟蹤到具體的欄位更改配置,如代碼清單11-1中,TRACK_COLUMNS_UPDATED配置所示,當選項為ON狀態時,將會記錄下變更追蹤修改的欄位,當為OFF時,將不會記錄。
USE master
GO
ALTER DATABASE [AdventureWorks2008R2] SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS,AUTO_CLEANUP = ON);
GO
USE AdventureWorks2008R2
GO
ALTER TABLE Person.BusinessEntity ENABLE CHANGE_TRACKING WITH(TRACK_COLUMNS_UPDATED = ON);
GO
?
UPDATE TOP(10) Person.BusinessEntity
SET ModifiedDate=ModifiedDate;
GO
?
SELECT *
FROM CHANGETABLE(CHANGES Person.BusinessEntity,0) AS o;
GO
?
代碼清單11-1 設定變更追蹤
圖11-6 變更追蹤查詢結果
代碼清單11-1中的執行結果11-6中所示,使用CHANGETABLE可以獲得對應表的更改曆史,更改曆史會將原有表的主鍵記錄下來,11-6中BusinessEntityID欄位所示。
關於變更追蹤的詳細資料,可以參考一下SQL Server聯機叢書。
- Service Broker
Service Broker是SQL Server內建的訊息佇列機制,通過Service Broker可以實現資料執行個體與執行個體間的通訊,同時也可以作為資料庫執行個體與應用程式的訊息傳遞機制。
同時,Service Broker是隊列機制實現的,可以保證訊息的執行順序,對於具有事務性要求的資料同步,Service Broker將是很理想的一個資料同步實現。
如代碼清單11-2中所示,配置了Service Broker在同執行個體下的同步配置。配置包括建立訊息類型(Message Type),建立郵件規則(Contract),隊列(Queue)以及服務(Server)。其層級結構11-7中所示,首先,訊息是存放在隊列中的,每個隊列都需要一個唯一的服務對應,服務將成為找到對應的標識。服務與服務間通訊時,需要指定相同的,相互可以識別到的郵件規則,這些規則會指定對應的訊息通訊的類型。其工作的流程,11-8中所示。
圖11-7 Service Broker的組件組成
圖11-8 Service Broker的工作原理
當需要進行隊列傳輸前,需要開啟一個會話(Conversation),通過會話記錄下對應的服務識別,標識從源服務發送到目標服務。找到會話標識後便可以找到對應的隊列。
開啟會話以後,進行訊息發送,對於資料庫執行個體來說,只需要將訊息寫入到發送隊列就可以了。訊息被寫入到發送隊列後,後續的工作都交給Service Broker來處理。
當訊息進入發送隊列,Service Broker根據會話記錄的服務識別,找到目標服務,並將訊息拆分為多個訊息片斷,將訊息發送到目標服務,服務接收完成所有的訊息後,將訊息寫入到目標隊列中。在寫入到目標隊列後,訊息傳遞就結束了。後續的工作便交給應用處理了。
應用需要調用接收訊息的命令,將訊息從接收隊列中取出,並進行一系列的後續業務工作。
關於Service Broker可以參考SQL Server聯機叢書(http://technet.microsoft.com/zh-cn/library/ms166104(v=SQL.105).aspx)。
下面的代碼是一份在同一執行個體下進行Service Broker配置以及測試的指令碼,可以參考一下代碼,並結合11-8中的工作原理參考Service Broker的工作方式。
use master
go
alter database AdventureWorks2008R2 set enable_broker with rollback immediate;
go
?
use AdventureWorks2008R2
go
?
create message type ReceiveMsgType validation = none;
create message type SendMsgType validation = none;
?
go
create contract SampleContract(SendMsgType sent by initiator,ReceiveMsgType sent by target,FraudEndOfStream sent by initiator);
go
?
create queue SampleTargetQue;
create service SampleTargetSrv on queue SampleTargetQue(SampleContract);
go
?
create queue SampleInitQue;
create service SampleInitSrv on queue SampleInitQue(SampleContract);
go
?
/********************************Send Test********************************************
declare @handle uniqueidentifier,@msg varchar(8000) = ‘this is a test message!‘;
?
begin dialog conversation @handle
from service SampleInitSrv
to service ‘SampleTargetSrv‘
on contract SampleContract
with encryption = off;
?
send on conversation @handle
message type SendMsgType(@msg)
?
**********************************************************************************/
?
/*****************************Receive Test*************************************************
declare @receivemsg varchar(8000),@Handle uniqueidentifier;
waitfor(receive top(1) @Handle = conversation_handle,
[email protected] = Message_Body
????????????from SampleTargetQue),timeout 1000
end conversation @handle;
select @receivemsg;
?
**********************************************************************************/
代碼清單11-2 同執行個體下的Service Broker配置
SQL Server分散式資料庫技術(LinkedServer,CT,SSB)