適用環境sql
操做系統:windows 2003數據庫
數據庫:sql server 2000/sql server 2005/sql server 2008windows
使用連接服務器進行遠程數據庫訪問的狀況安全
1、 問題現象服務器
在執行分佈式事務時,在sql server 2005下收到以下錯誤:網絡
消息 7391,級別 16,狀態 2,過程 xxxxx,第 16 行分佈式
沒法執行該操做,由於連接服務器 "xxxxx" 的 OLE DB 訪問接口 "SQLNCLI" 沒法啓動分佈式事務。ide
在sql server 2000下收到以下錯誤:工具
該操做未能執行,由於 OLE DB 提供程序 'SQLOLEDB' 沒法啓動分佈式事務。oop
[OLE/DB provider returned message: 新事務不能登記到指定的事務處理器中。 ]
OLE DB 錯誤跟蹤[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
在sql server 2008下收到以下錯誤:
連接服務器"xxxxx"的 OLE DB 訪問接口 "SQLNCLI10" 返回了消息 "該夥伴事務管理器已經禁止了它對遠程/網絡事務的支持。"。
沒法執行該操做,由於連接服務器 "xxxxx" 的 OLE DB 訪問接口 "SQLNCLI10" 沒法啓動分佈式事務。
2、 解決方案1. 雙方啓動MSDTC服務
MSDTC服務提供分佈式事務服務,若是要在數據庫中使用分佈式事務,必須在參與的雙方服務器啓動MSDTC(Distributed Transaction Coordinator)服務。
2. 打開雙方135端口
MSDTC服務依賴於RPC(Remote Procedure Call (RPC))服務,RPC使用135端口,保證RPC服務啓動,若是服務器有防火牆,保證135端口不被防火牆擋住。
使用「telnet IP 135 」命令測試對方端口是否對外開放。也可用端口掃描軟件(好比Advanced Port Scanner)掃描端口以判斷端口是否開放。
3. 保證連接服務器中語句沒有訪問發起事務服務器的操做
在發起事務的服務器執行連接服務器上的查詢、視圖或存儲過程當中含有訪問發起事務服務器的操做,這樣的操做叫作環回(loopback),是不被支持的,因此要保證在連接服務器中不存在此類操做。
4. 在事務開始前加入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服務器,一般有兩種狀況:
l 第一種狀況,產品選」sql server」
EXEC sp_addlinkedserver
@server='linkServerName',
@srvproduct = N'SQL Server'
這種狀況,@server (linkServerName)就是要連接的sqlserver服務器名或者ip地址。
l 第二種狀況,訪問接口選「Microsoft OLE DB Provider Sql Server」或「Sql Native Client」
EXEC sp_addlinkedserver
@server=' linkServerName ',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='sqlServerName'
這種狀況,@datasrc(sqlServerName)就是要連接的實際sqlserver服務器名或者ip地址。
Sql server數據庫引擎是經過上面設置的服務器名或者ip地址訪問連接服務器,DTC服務只經過服務器名地址訪問連接服務器,因此要保證數據庫引擎和DTC都能經過服務器名或者ip地址訪問到連接服務器。
數據庫引擎和DTC解析服務器的方式不太同樣,下面分別敘述
6.1 數據庫引擎
第一種狀況的@server或者第二種狀況的@datasrc設置爲ip地址時,數據庫引擎會根據ip地址訪問連接服務器,這時不須要作名稱解析。
第一種狀況的@server或者第二種狀況的@datasrc設置爲sql server服務器名時,須要作名稱解析,就是把服務器名解析爲ip地址。
有兩個辦法解析服務器名:
一是在sql server客戶端配置中設置一個別名,將上面的服務器名對應到連接服務器的ip地址。
二是在「C:\WINDOWS\system32\drivers\etc\hosts」文件中增長一條記錄:
xxx.xxx.xxx.xxx 服務器名
做用一樣是把服務器名對應到連接服務器的ip地址。
6.2 DTC
無論哪種狀況,只要@server設置的是服務器名而不是ip地址,就須要進行名稱解析,辦法同上面第二種辦法,在hosts文件中增長解析記錄,上面的第一種辦法對DTC不起做用。
若是@server設置的是ip地址,一樣不須要作域名解析工做。
7. 遠程服務器上的名稱解析
分佈式事務的參與服務器是須要相互訪問的,發起查詢的服務器要根據機器名或ip查找遠程服務器的,一樣遠程服務器也要查找發起服務器,遠程服務器經過發起服務器的機器名查找服務器,因此要保證遠程服務器可以經過發起服務器的機器名訪問到發起服務器。
通常的,兩個服務器在同一網段機器名能就行很好的解析,可是也不保證都能很好的解析,因此比較保險的作法是:
在遠程服務器的在「C:\WINDOWS\system32\drivers\etc\hosts」文件中增長一條記錄:
xxx.xxx.xxx.xxx 發起服務器名
8.檢查你的兩臺服務器是否在同一個域中. 若是不在同一個域中,是否創建可信任聯接.