SqlServer2008 跨服務器同步數據


最近工作中需要跨服務器同步數據,在數據庫DB1中的表T1插入數據,同時觸發T1的觸發器(這里暫不討論觸發器的效率問題),向另一台服務器DB2中的相同的一張表T2插入數據,查看了一些資料說,

需要打開DTC(分布式交易協調器)協調跨多個數據庫、消息隊列、文件系統等資源管理器的事務,

於是按照網上說的,將自己的DTC打開啟動,步驟如下:

DTC位置:控制面板--管理工具--服務--Distributed Transaction Coordinator

然后在本機SqlServer里新建一個觸發器測試了一下,提示“該伙伴事務管理器已經禁止了它對遠程/網絡事務的支持”

出現這個問題的原因是對方電腦沒有配置好DTC,所以需要將另一台服務器也做如下配置:

兩台服務器電腦做如下配置(windows2003系統):

2. 單擊“添加/刪除 Windows 組件”。 
3. 選擇“應用程序服務器”,然后單擊“詳細信息”。 
4. 選擇“啟用網絡 DTC 訪問”,然后單擊“確定”。 
5. 單擊“下一步”;單擊“完成”。 
6. 在"開始"->"運行"中輸入dcomcnfg.exe啟動"組件服務"。
7. 右鍵“我的電腦”->“屬性”,在MSDTC選項卡中,點擊“安全配置”按鈕。
8. 在安全配置窗口中做如下設置:
(1)選中“網絡DTC訪問”
(2)在客戶端管理中選中“允許遠程客戶端”“允許遠程管理”
(3)在事務管理通訊中選“允許入站”“允許出站”“不要求進行驗證”
(4)保證DTC登陸賬戶為:NT Authority\NetworkService 
(5)單擊"確定"。這樣將會提示您"MS DTC 將會停止並重新啟動。 
   所有的依賴服務將被停止。請按'是'繼續"。單擊"是"繼續。 

 

 

我當時先拿同事的電腦做了下測試,同事的系統是Win7,按上面的步驟沒有找到“應用程序服務器”,需要按下面的方法操作:

Vista, Windows 7,Windows Server 2008 MSDTC配置  
1. 打開“控制面板(Control Panel)―管理工具(Administrative Tools)―組件服務(Component 
Service)”(或者開始-運行 “Dcomcnfg.exe”)  


2. 打開“組件服務(Component Service)―計算機(Computers)”  


3. 在“我的電腦(My Computer)”上點擊右鍵,點擊“屬性(Properties)”

4. 在Local DTC Properties對話框中,點擊“安全(Security)”選項卡。      在安全配置選項卡中做如下設置:  

選中“網絡DTC訪問(Network DTC Access)”   在客戶端管理(Client and Administration)中選中“允許遠程客戶端(Allow remote Clients)”
和“允許遠程管理(Allow Remote Administration)”  
在事務管理通訊(Transaction Manager Communication)中選“允許入站(Allow 
Inbound)”“允許出站(Allow Outbound)”“不要求進行驗證(No Authentication Required)”  
保證DTC登陸賬戶為:NT Authority\Network Service 

 

再次測試出現提示:“其他會話正在使用事務的上下文”,這是因為對方服務器表中也有觸發器,需要進行一下判斷。

********************************當兩台服務器不在一個網段的時候,還有可能出現一個問題*******************************

如果兩台服務器在一個網段的時候,按上面的設置,基本就可以搞定了,但是當兩台服務器不在一個網段的時候,SQLServer還有可能報下面的錯誤:

鏈接服務的OLE DB 訪問接“SQLNCLI10”返回了消息“該事務管理已經禁止了它對遠程事務的支持”

然后我對要請求訪問的服務器A做了以下操作,修改A服務器的host文件,增加B的IP地址和服務器名,然后問題就解決了。

 

下面給出測試的例子:

--創建測試表
CREATE TABLE [dbo].[TB1](
    [id] [int] NULL,
    [age] [money] NULL
) ON [PRIMARY]

GO

--創建鏈接服務器 
exec sp_addlinkedserver   'it38 ', ' ', 'SQLOLEDB ', '172.16.3.38' --對方服務器地址
exec sp_addlinkedsrvlogin  'it38 ', 'false ',null, 'sa', 'sa' --對方服務器用戶名密碼
--刪除創建的鏈接服務器時使用
--exec sp_dropserver  'it38 ', 'droplogins ' 
--為表TB1創建觸發器
CREATE TRIGGER [dbo].[tr_qiao] on [dbo].[TB1]
FOR INSERT
AS
BEGIN
  SET NOCOUNT ON
  SET XACT_ABORT ON 
 INSERT INTO it38.[數據庫名].dbo.TB1(id,age) 
  SELECT id, age FROM inserted;
END
GO

--***********************************************
--查詢對方數據庫表數據
SELECT * FROM it38.[數據庫名].[dbo].[TB1]
--插入一條數據測試 INSERT INTO TB1(id,age) values(5,55);

 


免責聲明!

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



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