一、如何配置分布式事務的詳細步驟
1. 雙方啟動MSDTC服務
MSDTC服務提供分布式事務服務,如果要在數據庫中使用 SQL Server分布式事務,必須在參與的雙方服務器啟動MSDTC(Distributed Transaction Coordinator)服務。
2. 打開雙方135端口
MSDTC服務依賴於RPC(Remote Procedure Call (RPC))服務,RPC使用135端口,保證RPC服務啟動,如果服務器有防火牆,保證135端口不被防火牆擋住。使用“telnet IP 135 ”命令測試對方端口是否對外開放。也可用端口掃描軟件(比如Advanced Port Scanner)掃描端口以判斷端口是否開放。
在雙方防火牆中增加MSDTC.exe例外
可用命令行: netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable
3.避免環回loopback
保證鏈接服務器中語句沒有訪問發起事務服務器的操作在發起事務的服務器執行鏈接服務器上的查詢、視圖或存儲過程中含有訪問發起事務服務器的操作,這樣的操作叫做環回(loopback),是不被支持的,所以要保證在鏈接服務器中不存在此類操作。‘
4.在事務開始前加入set xact_abort ON
在事務開始前加入set xact_abort ON 語句對於大多數 OLE DB 提供程序(包括 SQL Server),必須將隱式或顯示事務中的數據修改語句中的 XACT_ABORT 設置為 ON。唯一不需要該選項的情況是在提供程序支持嵌套事務時。
5. MSDTC設置
打開“管理工具――組件服務”,以此打開“組件服務――計算機”,在“我的電腦”上點擊右鍵。在MSDTC選項卡中,點擊“安全配置”按鈕。
在安全配置窗口中做如下設置:l 選中“網絡DTC訪問”l 在客戶端管理中選中“允許遠程客戶端”“允許遠程管理”l 在事務管理通訊中選“允許入站”“允許出站”“不要求進行驗證”l 保證DTC登陸賬戶為:NT Authority\NetworkService
6.服務器屬性中開啟
[ 鏈接服務器和名稱解析問題建立鏈接SQL Server服務器]
通常有兩種情況:
第一種情況,產品選”SQL Server”EXEC sp_addlinkedserver @server='linkServerName', @srvproduct = N'SQL Server' 這種情況,@server (linkServerName)就是要鏈接的sqlserver服務器名或者ip地址。
第二種情況,訪問接口選“Microsoft OLE DB Provider SQL Server”或“Sql Native Client”EXEC sp_addlinkedserver @server=' linkServerName ', @srvproduct='', @provider='SQLNCLI', @datasrc='sqlServerName' 這種情況,@datasrc(sqlServerName)就是要鏈接的實際sqlserver服務器名或者ip地址。
連接服務器具體使用參考:https://www.cnblogs.com/gered/p/9223569.html#_label1
【最佳實踐參考】
Windows中MSDTC(分布式事務處理)系統配置方法
DTC幫助我們實現分布式數據庫服務器之間集合事務處理,即遠程異地事務處理功能;
例如:有多個SQL SERVER服務器,我們要讓它互相執行更新操作,但又要保證事務的完整性,就可以開啟DTC功能進行實現;
SQL SERVER分布式事務腳本舉例
{ SET XACT_ABORT ON BEGIN TRAN INSERT INTO [192.168.88.61].ccerp_test.dbo.spkfk ( spid , spbh ) SELECT '遠程','遠程' INSERT INTO spkfk ( spid , spbh ) SELECT '本地','本地' COMMIT }
DTC配置方法
-
檢查系統開啟了DTC服務;
打開【管理工具】->【服務】,檢查Distributed Transaction Coordinator、Remote Procedure Call (RPC)兩個組件是否已啟動;如果沒有啟動就將它們啟動;
如圖1:(一般正常啟動了Distributed Transaction Coordinator組件,Remote Procedure Call (RPC)也會自動啟動)
(圖1)
-
設置DTC服務;
打開【管理工具】->【組件服務】,找到【分布式事務處理協調器】,點屬性對它進行設置;
2003、2008 SERVER設置它時,操作位置界面會若有區別;
但其需要設置的內容:
(1)、【默認協調器】:使用本地協調器;
(2)、設置內容:如圖2:
(圖2)
-
設置參加DTC的各機防火牆;
打開【控制面板】->【防火牆】,添加例外的應用程序:將分布式協調器MSDTC.exe添加到例外中;
C:\Windows\System32\MSDTC.exe
設置完后防火牆設置如圖3:
(如圖3)
-
MSDTC配置完后的測試;(注:把防火牆關了進行測)
微軟提供的:DTCPing工具
下載鏈接:https://www.microsoft.com/en-us/download/details.aspx?id=2868
綠色的,直接點擊:Dtcping.exe進行運行;然后解壓到指定目錄即可
然后
我們發現必須要寫那個名稱 NetBIOS 名稱(主機名)
點擊【PING】,如果上面的英文反饋是RPC拼通無問題就Ok,反之報錯就需要繼續檢查;
如圖下圖,點擊【PING】,如果上面的英文反饋是RPC拼通無問題就Ok,反之報錯就需要繼續檢查;
【dtcping報錯】
Microsoft的分布式服務支持團隊每天都會幫助客戶排除一些最常見的分布式事務錯誤,這些錯誤是MSRPC(Microsoft遠程過程調用)通信在網絡中因某些安全\防火牆設置而失敗的直接結果。在應用程序層(如SQL)上,這些是將被冒泡的常見錯誤消息。
- 服務器:消息7391,級別16,狀態1,行2無法執行操作,因為OLE DB提供程序“SQLOLEDB”無法啟動分布式事務。OLE / DB提供程序返回消息:新事務無法在指定的事務協調器中登記。
- 新事務無法在指定的事務協調器中登記(0x8004d00a)
- 事務已被隱式或顯式提交或中止(0x8004d00e)
如果在使用應用程序中的分布式事務時遇到上述錯誤消息之一,請隨時使用DTCPING工具找出問題所在。本博客介紹了如何使用DTCPing工具縮小問題的根源以及如何解決問題。
分布式事務(特別是OleTx事務)使用MSRPC協議與另一台機器上的MSDTC進行通信。為確保兩台計算機能夠使用MSRPC協議相互通信,您可以在兩台計算機上運行DTCPING工具,以測試正常的RPC通信是否正常工作。在討論此工具引發的各種錯誤之前,了解正確運行工具的正確方法非常重要,這樣我們才能從工具中獲得正確的輸出
- 只要有多個服務器參與事務,分布式事務就會顯示在圖像中。如果分布式事務中只涉及一個服務器,並且在運行分布式事務時仍然遇到一些錯誤,那么這不是正確的文章。確定參與分布式事務的正確服務器后,在兩台計算機上同時啟動DTCPING.EXE工具。在放置正確的服務器名稱並單擊PING按鈕之前,DTCPING.EXE應在兩台計算機上同時運行。
- 在DTCPING工具的遠程服務器名稱部分中,您應該只放置您嘗試運行分布式事務的服務器的NETBIOS名稱。在指定服務器的IP地址或服務器的FQDN之后執行的任何測試都是無效測試。您必須提供您嘗試運行分布式事務的服務器的NETBIOS名稱,因為MSDTC使用MSRPC作為基礎機制,MSRPC僅適用於NETBIOS名稱解析。
- 在群集中 - 在群集計算機上,您應始終放置MSDTC資源所依賴的NETWORK RESOURCE的名稱在“遠程服務器名稱”字段中。要找到要在DTCPing中使用的正確NETWORK NAME,請打開群集管理器並轉到存在MSDTC資源的組。該組應具有DTC資源所依賴的一個網絡名稱資源。要查找網絡名稱,只需轉到網絡名稱資源的屬性,然后轉到“參數”選項卡。您在其中看到的名稱是此MSDTC資源的網絡名稱。讓我們通過一個例子來理解這一點: - 假設您有一個2節點集群,其中兩個節點的NETBIOS名稱為DBSERVER01和DBSERVER02,並且您嘗試從第三個服務器APPSERVER運行分布式事務。然后以正確的方式運行DTCPing,您應該在APPSERVER和集群的活動節點上啟動DTCPING.EXE。(通過主動節點,我指的是DTC資源在線的節點。然后從群集管理器轉到分布式事務處理協調器資源所在的NETWORK NAME資源的屬性,並轉到PARAMETERS選項卡。請注意此網絡名稱。確定正確的網絡名稱后,在群集的活動節點和APPSERVER上以及APPSERVER上的DTCPing窗口內啟動DTCPING,在(遠程服務器名稱)字段中輸入群集MSDTC資源的網絡名稱,然后點擊PING。
- 在測試時,應始終只在服務器上運行一個DTCPING.EXE實例,對於后續測試,應始終關閉DTCPING工具並再次打開它。
確保您已正確閱讀上述要點后,您應該只運行DTCPING工具並在遠程服務器名稱中輸入正確的服務器名稱,然后單擊PING。如果一切正常,您應該看到該工具返回以下消息。(此處DTCPing從具有NETBIOS名稱SOURCE的機器運行到具有NETBIOS名稱DESTINATION的機器)
++++++++++++++++++++++++++++++++++++++++++++++
DTCping 1.9 Report for SOURCE
++++++++++++++++++++++++++++++++++++++++++++++
RPC server is ready
++++++++++++Validating Remote Computer Name++++++++++++
11-21, 04:31:01.455-->Start DTC connection test
Name Resolution:
DESTINATION-->65.52.22.254-->DESTINATION.contoso.com
11-21, 04:31:01.470-->Start RPC test (SOURCE-->DESTINATION)
RPC test is successful
Partner's CID:084B708C-F0C5-4E65-95F2-8E2DEF73FFF3
++++++++++++RPC test completed+++++++++++++++
++++++++++++Start DTC Binding Test +++++++++++++
Trying Bind to DESTINATION
11-21, 04:31:01.830-->SOURCE Initiating DTC Binding Test....
Test Guid:B5544E05-D64B-40AC-B283-71947914DED3
Received reverse bind call from DESTINATION
Network Name: SOURCE
Source Port: 1116
Hosting Machine:SOURCE
Binding success: SOURCE-->DESTINATION
++++++++++++DTC Binding Test END+++++++++++++
如果看到上述消息,請轉到第二個服務器並將源服務器的名稱放在“遠程服務器名稱”字段中,然后單擊PING並確保看到與上面相同的結果。如果兩個服務器在運行DTCPING工具后返回成功但分布式事務仍然無法正常工作,那么您應該看到本文的第二部分討論了當DTCPING在兩台機器之間正常工作時如何解決分布式事務問題。
錯誤消息1 - gethostbyname失敗
DTCPing log file: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES8618
RPC server is ready
Please Start Partner DTCPing before pinging
++++++++++++Validating Remote Computer Name++++++++++++
Please refer to following log file for details: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES861840.log
Error(0xB7) at nameping.cpp @43
-->gethostbyname failure -->183(Cannot create a file when that file already exists.)
Can not resolve abc Invalid remote host name:abc
我認為這個錯誤不僅僅是自我解釋。如果您在遠程服務器名稱中添加的主機名不是有效的主機名,您將獲得此名稱。通過運行ping命令,確保您在DTCPING工具中指定的遠程服務器名稱解析為有效的IP地址。如果該主機名未解析為任何IP地址,則可以嘗試在hosts文件中添加主機名,然后再次嘗試運行該工具。
錯誤消息2 - RPC服務器不可用
DTCping log file: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES8618
RPC server is ready Please Start Partner DTCping before pinging
++++++++++++Validating Remote Computer Name++++++++++++
Please refer to following log file for details: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES861896.log
Invoking RPC method on turtle86
Problem:fail to invoke remote RPC method Error(0x6BA) at dtcping.cpp @303
-->RPC pinging exception -->1722(The RPC server is unavailable.)
RPC test failed
這表示防火牆上的端口135或DCOM端口范圍中的一個端口被阻止。為了進一步確認這一點,我們說你從SERVER01運行DTCPING到SERVER02,你得到了這個錯誤。現在打開SERVER01上的命令提示符並鍵入telnet SERVER02 135(在運行此測試之前,只需確保在服務器上啟動Telnet服務。在Windows 2008 Server上,默認情況下不安裝telnet服務,您必須安裝它通過在服務器上配置角色服務。如果您看到一個光標閃爍的空白窗口,這足以告訴端口未被阻止,但如果telnet命令失敗並出現錯誤,您可以輕松推斷端口135被阻止,您應該檢查您的網絡團隊使端口135在防火牆上雙向打開。如果telnet到端口135工作正常,那么在SERVER02上執行NETSTAT -anob並找出DTCPING.EXE正在偵聽的端口。然后返回SERVER01並執行telnet SERVER02 <PORT_NUMBER>。如果您收到此錯誤,則此測試必須失敗。MSDTC使用MSRPC協議與遠程計算機上的MSDTC通信。由於MSRPC協議正常工作,MSDTC可以自由使用1024-65535范圍內的一個動態端口。如果MSDTC可以使用此范圍內的任何一個端口,那么我應該如何配置我的防火牆?我是否應該領先並在防火牆上打開整個范圍?那么什么是防火牆?答案是 - 你不要'請再次注意 - 此范圍會影響所有使用MSRPC的程序,而不僅僅是MSDTC。您可以在注冊表或DCOMCNFG UI中配置此范圍。要指定此范圍,請向下滾動到“限制DCOM端口范圍”部分,該部分討論如何限制DCOM使用特定端口范圍。
錯誤消息3 - 遠程過程調用失敗
RPC server is ready
++++++++++++Validating Remote Computer Name++++++++++++
Problem:fail to invoke remote RPC method
Error(0x6BE) at dtcping.cpp @303
-->RPC pinging exception -->1726(The remote procedure call failed.)
RPC test failed
此錯誤是防火牆斷開兩台計算機之間TCP連接的結果。您必須與防火牆管理員聯系,以幫助您找出防火牆關閉兩台計算機之間TCP連接的原因。要解決此錯誤,您可以在兩台計算機上安裝網絡監視器工具並重新運行測試,您應該看到嘗試關閉連接的網絡設備發送的TCP RESET數據包。
錯誤信息4 - 終結點映射器不再有端點
DTCping log file: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES8626
RPC server is ready Please Start Partner DTCping before pinging
++++++++++++Validating Remote Computer Name++++++++++++
Please refer to following log file for details: C:\Documents and Settings\username\Desktop\DTC_PING\TURTLES86268.log
Invoking RPC method on turtle86
Problem:fail to invoke remote RPC method Error(0x6D9) at dtcping.cpp @303
-->RPC pinging exception -->1753(There are no more endpoints available from the endpoint mapper.)
RPC test failed
此錯誤使得RPC似乎耗盡了DCOM端口,但您不應立即將此錯誤推斷為端口耗盡。如果您能夠在兩台計算機上運行DTCPING.EXE並在啟動EXE期間,該工具不會抱怨端口出錯,那么此錯誤只是防火牆阻塞端口和故障排除的結果錯誤應該與故障排除“RPC服務器不可用”錯誤完全相同,如上所述。我為什么這么說?假設我們的DCOM端口耗盡(如果你指定了一個端口范圍並且范圍太小,小於30,則通常會發生這種情況),那么你應該在啟動DTCPING.EXE時看到錯誤。因為那是DTCPing的時候。exe將聯系End Point Mapper服務(RpcSS)並要求動態端口。如果DTCPing.exe啟動就好了,那就意味着它獲得了分配給它的正確端口,因此不存在Endpoint Mapper耗盡DCOM端口的問題。
錯誤消息5 - 錯誤消息5 - 訪問被拒絕
Invoking RPC method on TURTLE86
Problem:fail to invoke remote RPC method
Error(0x5) at dtcping.cpp @303
-->RPC pinging exception
-->5(Access is denied.)
僅當目標計算機是Windows XP計算機或Windows VISTA計算機時才會出現此錯誤。這是RPC層中的附加安全性,它在客戶端操作系統上配置。有關此安全方面的更多詳細信息,請參見Technet上的文章“RPC Interface Restriction”
要解決此錯誤,只需按照以下步驟配置注冊表項並重新啟動計算機。
- 單擊“開始”,單擊“運行”,鍵入Regedit,然后單擊“確定”。
- 找到並單擊以下注冊表項: HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows NT
- 在“編輯”菜單上,指向“新建”,然后單擊“密鑰”。
- 注意如果RPC注冊表項已存在,請轉到步驟5。
- 鍵入RPC,然后按ENTER鍵。單擊RPC。
- 在“編輯”菜單上,指向“新建”,然后單擊“DWORD值”。
- 鍵入RestrictRemoteClients,然后按ENTER鍵。
- 單擊RestrictRemoteClients。
- 在“編輯”菜單上,單擊“修改”。
- 在“數值數據”框中,鍵入0,然后單擊“確定”。
- 注意要啟用RestrictRemoteClients設置,請鍵入1。
- 關閉注冊表編輯器並重新啟動計算機
錯誤消息6 - 沒有足夠的資源可用於完成此操作
DTCping log file: Z:\Tools\DTC_PING\TURTLE865072.log
Error(0x6B9) at rpcUtil.cpp @133
-->I_RpcServerAllocateIpPort
-->1721(Not enough resources are available to complete this operation.)
Error(0x6B9) at rpcUtil.cpp @54
-->1721(Not enough resources are available to complete this operation.)
啟動DTCPING窗口后,您將立即收到此錯誤消息。此錯誤消息表示RPC正在耗盡計算機上的端口,因為您定義的DCOM端口范圍太小或者有很多其他RPC應用程序正在使用DCOM端口(通常DCOM或RPC程序只使用一個DCOM端口,但應用程序可以通過直接調用RPC API來獲取多個DCOM端口。要修復此錯誤消息,請按照以下步驟增加端口范圍。
限制DCOM港口范圍
1.轉到開始 - >運行。輸入DCOMCNFG。
2.轉到“組件服務”下“計算機”文件夾下的“我的電腦”節點的屬性。
3.在“我的電腦屬性”下,在“默認協議”選項卡下查看。
4.在那里確保選擇了面向連接的TCP / IP,然后單擊屬性。
你會看到這樣一個窗口
如果您沒有看到上面的范圍,並且窗口看起來與上面的那個完全相同,那么這意味着計算機上未配置DCOM端口范圍。
您可以在上面的窗口中單擊“添加”並鍵入范圍(假設為5000-5100)並說出“確定”。確保它看起來像這樣。(應為Internet范圍選擇單選按鈕)
您必須在兩台計算機上配置此范圍,然后必須重新啟動兩個服務器才能使此范圍生效。完成后,您必須雙向打開防火牆上的相同范圍。
假設您已經打開了足夠的端口但仍然收到此錯誤消息。在這種情況下,您應該在返回此錯誤消息的計算機上運行NETSTAT -anob並嘗試找出正在使用所有端口的程序。您應該查找在RPC端口范圍中定義的端口,並查找正在偵聽該端口范圍的所有EXE。
我們希望本文能夠為您提供有關如何使用DTCPing工具解決MSDTC問題的充分信息,我們希望您能夠進一步解決和診斷與MSDTC相關的問題。如果您仍然需要我們的幫助來解決上述博客中提到的任何DTCPING錯誤,請隨時從機器(運行DTCPING)收集DTCPING日志文件並打開Microsoft支持事件。一旦我們有正確的數據可供查看,我們(MSDTC支持團隊)將非常樂意為您提供及時解決問題的方法。
如果您有興趣深入了解DCOM和防火牆概念,請隨時瀏覽以下有關DCOM問題的文章。
- DTCPING.exe下載http://download.microsoft.com/download/d/0/0/d00c8f6b-135d-4441-a97b-9de16a1935c1/dtcping.exe
- 將分布式COM與防火牆一起使用http://msdn.microsoft.com/en-us/library/ms809327.aspx
- 配置Microsoft分布式事務處理協調器(DTC)以通過防火牆工作http://support.microsoft.com/kb/250367/en-us
- 群集環境中的MSDTC客戶端必須具有的名稱和IP地址的說明http://support.microsoft.com/kb/311846/en-us
- 解決MSDTC問題http://msdn.microsoft.com/en-us/library/aa561924.aspx