出自: http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx
一。前言
?
在使用SQL Server?的過程中,用戶遇到的最多的莫過于連接問題了。本文將深度討論SQL Server?連接問題的方方面面,希望能幫你徹底解決SQL server?的連接問題。
?
SQL Server?支持的通訊協議很多,如命名管道(Named Pipes)、TCP/IP?套接字、共享內存(Shared Memory)等。由于最常用的是前兩種即命名管道和TCP/IP套接字,所以我們主要討論這兩種協議的連接問題。先來討論命名管道,然后我們再討論TCP/IP。
?
二。什么是命名管道(Named Pipes)
?
在Windows?系統中,進程間通信機制有郵槽,管道和套接字等. Windows平臺上就管道而言,有命名管道和匿名管道兩種。命名管道通過進程間通訊(IPC)機制實現通訊,?利用它能夠在同一臺計算機的不同進程之間,或在跨越一個網絡的不同計算機的進程之間,進行單向或雙向的數據通信。具體點說,?命名管道建立在服務器的IPC$共享基礎上,通過IPC$共享來進行通訊。管道的名稱也是和網絡共享類似,都是UNC格式(見后面討論的命名管道命名格式)。
?
如果你曾使用命名管道進行編程,你就會發現命令管道利用標準的Win32文件系統API?函數(如ReadFile和WriteFile)來進行數據的收發,與系統基層網絡傳送協議(如TCP,NETBEUI或IPX等)無關.?客戶端使用命名管道連接的基本過程如下:
?
(1)SQL Server服務器使用CreateNamedPipe函數創建命名管道并對之進行監聽.
(2)客戶端使用CreateFile()和WriteFile()函數試圖連接到服務器的命名管道.
?
綜上所述,
?
1)?命名管道不是一個基層網絡協議
?
由于命名管道運行在TCP,NETBEUI等基礎協議之上,不是一個基層網絡傳送協議,?所以即使客戶機和SQL Server?服務器之間使用命名管道通訊,?你亦需要配置TCP或其它基層網絡協議以保證客戶機和SQL服務器之間的網絡連通性.
?
2)?命名管道是一個需要通過系統認證的協議
?
當客戶端使用命名管道協議連接的時候,?它會首先訪問服務器的IPC$共享。訪問IPC$共享必須通過Windows?的認證。通過了這個認證后,才可以真正連接到SQL Server?監聽的管道上。所以說命名管道是一個需要通過Windows認證的協議.?這是使用命名管道的最大一項好處,即用它可以直接利用Windows Server內置的安全機制.?如果你沒有訪問SQL Server?服務器的文件系統的權限(Permission),那么你就無法使用命名管道訪問SQL Server。
?
三。SQL Sever?命名管道工作原理
?
SQL Server?首先在服務器上創建一個命名管道并監聽之,然后客戶端即可連接到這個管道上來進行對話。對每一個客戶端管道連接請求SQL Server都會創建一個新的管道實例來與之進行通訊。
?
1.?命名管道的名稱。
?
SQL Server和其它Windows程序一樣都采用UNC格式標識命名管道。例如:
?
\\server\Pipe\path_name
?
上述命名管道標識字符串可分為三部分
?
\\server部分: 指定命名管道所在服務器的名字。命名管道便是在此機器上創建。SQL Server?多是用一個點(.)來表示它正在運行的本地服務器。
?
\Pipe部分:是一個固定的“硬編碼”字串(大小寫均可)表明是管道協議。
?
\path_name部分:命名管道的名字。可以是多級目錄。SQL Server?監聽的是兩級目錄即\sql\query。
?
缺省情況下,SQL Server監聽的命名管道名稱如下:
(默認實例和命名實例有不同的管道名字)
?
默認實例:\\.\pipe\sql\query
命名實例:\\.\pipe\MSSQL$instancename\sql\query
?
上述管道名稱pipe后面的部分可以在安裝?SQL Server?后使用服務器網絡實用工具進行更改。
?
?
2.?配置或查看SQL Server 2000?監聽的命名管道
?
在SQL Server 2000?服務器上運行svrnetcn.exe調出服務器網絡實用工具(英文名是SQL Server Network Utility),或者在"開始"菜單中,指向"程序",接著指向"Microsoft SQL Server",然后單擊"服務器網絡實用工具"。如果 "啟用的協議(Enabled Protocals)" 框內沒有命名管道則從左邊選中命名管道并點擊 啟用(Enabled) 按鈕加入(參考圖1)。選中命名管道協議并點擊 屬性 按鈕(Properties)即可查看或修改SQL Server?監聽的命名管道名稱(參考圖2)。如果剛剛啟用命名管道協議那么需要點擊OK按鈕并重新啟動SQL Server?服務才能生效。
?
(圖1:服務器網絡實用工具)
?
?
(圖2:命名管道名稱)
?
3.?配置或查看SQL Server 2005/SQL Server 2008?監聽的命名管道
?
打開SQL Server Configuration Manager,在左側的面板中展開SQL Server Network Configuration節點,并選中節點下面你想要操作的SQL Server實例。此時在右側的面板上會看到該實例的各個網絡協議是否啟用,其中包括命名管道。在協議名字的右側會顯示它當前的狀態是否為啟用。參考圖3。
?
(圖3 SQL Server Configuration Manager)
?
右鍵Named Pipes并選擇“ 啟用 ”。然后重啟SQL Server實例來使得剛才做的操作生效。
在圖3中,選中命名管道協議并點擊 屬性 按鈕(Properties)即可查看或修改SQL Server?監聽的命名管道名稱。
?
(圖4)
?
4.?驗證SQL Server?是否真的監聽了命名管道
?
解決命名管道連接問題的重要一步是檢查SQL Server是否真的監聽了命名管道。
?
在SQL Server 2000中,為了驗證SQL Server?確實監聽了命名管道,可以打開SQL Server Query Analyzer?(查詢分析器),然后運行如下命令:
exec master..xp_readerrorlog
?
在結果欄,如果看到如下一行則表明SQL Server已經監聽了命名管道:
?
2000-01-13 09:57:37.38 server SQL server listening on TCP, Shared Memory, Named Pipes.????
?
在SQL Server 2005或SQL Server 2008中,我們可以打開SQL Server Management Studio,然后運行:
exec master..xp_readerrorlog
?
你可以在結果欄中看到它監聽的管道名稱:
?
2011-01-12 11:35:37.980 Server???????Server named pipe provider is ready to accept connection on [ \\.\pipe\sql\query ].
四。客戶端的命名管道配置
?
大多數情況下在客戶端你不需要進行配置,因為命名管道協議默認是啟用的。但既然是檢查命名管道的連接問題,還是需要熟悉客戶端的命名管道配置。
?
1.?使用客戶端網絡實用工具
?
在客戶端可以使用客戶端網絡實用工具配置連接到SQL Server?使用的協議。運行cliconfg.exe或從開始-->程序-->Microsoft SQL Server -->客戶端網絡實用工具調出該工具(參考圖5)
?
(圖5:使用客戶端網絡實用工具)
?
客戶端網絡實用工具中左邊是禁用的協議,右邊的是啟用的協議。如果右邊沒有命名管道協議,則點擊Enable按鈕啟用它。右邊列表上的協議上下順序決定在連接?SQL Server?實例時客戶端超級套接字?Net-Library?(Dbnetlib.dll)考慮使用的客戶端協議的優先順序。你可以改變它。
?
選中命名管道點擊屬性(Properties)按鈕即可查看客戶端連接的缺省的命名管道名稱。
缺省情況下是sql\query(參考圖6)。需要注意的是該名稱是不完整的,連接的時候客戶端超級套接字網絡庫會自動補充完整成\\RemoteComputerName\pipe\sql\query?格式。
如果命名管道連接出現問題, 必須保證SQL Server?監聽的命名管道名稱和客戶端連接的缺省管道名稱是一致的。
?
(圖6:客戶端連接的缺省命名管道名稱)
?
2.使用SQL Server Configuration Manager
?
我們也可以過SQL Server Configuration Manager為SQL Server Native Client這個數據庫驅動配置客戶端網絡協議。
?
我們打開SQL Server Configuration Manager,在左側的面板中展開SQL Native Client??Configuration(或者SQL Native Client 10.0 Configuration)節點,并選中節點下面的Client Protocols。此時在右側面板你會看到所有支持的客戶端協議。我們可以通過右鍵來啟動和禁用命名管道協議。可以右鍵選擇屬性來編輯客戶端的默認管道。見圖7。
?
?
(圖7)
?
3.善用客戶端SQL Server別名
?
可以在客戶端配置SQL Server別名,以明確指定連接到SQL Server所使用的協議。在某些情況下,?SQL Server?監聽的命名管道或IP地址、端口等可能并不是缺省的那樣而是出于某種目的已被改變。在這種情況下就可以使用客戶端SQL Server別名來解決連接問題。使用客戶端網絡實用工具可以方便的創建、刪除或修改SQL Server別名(參考下面二圖):
?
?
(圖8)
?
注意上圖中的pipe name必須和服務器上監聽的命名管道名稱匹配,Server Name里填上的的字符串必須是正確的SQL Server服務器名字。而Server Alias里填的是任意的合法的名字字符串,不一定非得和SQL Server服務器名相同。
?
SQL Server Configuration Manager里面的配置步驟和上面的類似。(圖9)
?
?
?
(圖9)
五。 命名管道連接問題的解決步驟
?
好了,介紹到這里你應該對命名管道很不陌生了,也應該是時候討論命名管道連接問題的解決步驟了:
?
步驟1:使用服務器端網絡實用工具檢查命名管道配置并確認SQL Server已經監聽了命名管道協議。
?
步驟2:使用客戶端網絡實用工具檢查客戶端的連接協議配置,確保啟用了命名管道。當然,客戶端連接的缺省管道名稱需要和SQL服務器監聽的一致。另外,需要仔細查看是不是存在錯誤的SQL Server?別名。
?
步驟3:檢查網絡連通性。例如要確保不但能夠ping通?SQL Server服務器的IP地址,也
能夠ping?通SQL Server服務器的名稱。
?
步驟4:檢查客戶端是否能夠通過SQL Server?服務器的Windows認證。可以使用如下命令進行:
net view? \\servername
net use? \\servername\IPC$
?
如果這兩條命令出錯,則表明有訪問SQL Server服務器權限上的問題。需要掃除了這些問題之后再去解決命名管道連接的問題。
?
步驟?5:確保客戶端登錄(login)帳號有權限訪問SQL Server。為了簡化問題,排除Windows認證問題的干擾,在作這一類問題分析時,如果SQL Server配置了SQL Authentication,建議還是使用一個SQL Server帳號。等SQL Server帳號能連通以后,再使用Windows帳號。
?
如果上述五個步驟還不能解決命名管道的連接問題,那么你可以使用下面介紹的實用工具來測試命名管道。
?
?
六。測試命名管道連接的實用工具
?
SQL Server安裝盤帶有測試網絡命名管道服務完整性的實用工具makepipe和readpipe。 這兩個小工具需要一起使用。可在SQL Server 2000?光盤上的?x:\x86\Binn?目錄下找到該實用工具。使用方法如下:
?
1)在服務器的操作系統命令提示符處鍵入:
?
Makepipe /pmytestpipe
?
注意/p和后面的pipename不能有空格
這將創建命名管道? \\.\pipe\mytestpipe 。
?
運行該命令后返回信息如下:
Making PIPE:\\.\pipe\mytestpipe
read to write delay (seconds):0
Waiting for Client to Connect...
Waiting for client to send...??1
Data Read:
Hello world
(參考圖10)
(圖10:使用makepipe實用工具)
?
2)在客戶端工作站的操作系統命令提示符處鍵入:
?
readpipe /Smy server ?/D“Hello world” ?/pmytestpipe
?
其中 “Hello world” 是測試字符串。如果字符串包含空格,則必須括在雙引號內。 /S ?與服務器名稱之間無空格, /D ?與字符串之間無空格?/p與pipename之間不能有空格
?
如果命名管道連接可以建立,則客戶端工作站分別返回以下信息:
?
SvrName:\\myserver
PIPE???:\\myserver\pipe\mytestpipe
DATA???:Hello world
Data Sent: 1 :Hello world
Data Read: 1 :Hello world
?
(參考圖11)
(圖11:使用readpipe實用工具)
?
如果readpipe和makepipe工具無法連通,說明網絡命名管道服務不可用。這時候就需要先檢查網絡連通性問題或訪問Windows的權限問題。
七.?一些常見的連接問題
?
連接問題一 :
[Named Pipes]SQL Server does not exist or access denied.
[Named Pipes]ConnectionOpen (Connect()).
?
這個連接錯誤多是因為客戶端沒有找到命名管道服務器(也就是SQL Server)造成的。
解決方法:
1)檢查網絡連通性,如ping等,確認SQL Server已經啟動。
2)檢查SQL server?服務器端和客戶端的命名管道配置。
?
連接問題二:
Login failed for user?‘NULL’或Login failed for user anonymous
?
這個錯誤基本上意味著網絡連通性沒有問題, 只是使用命名管道訪問服務器有權限上的問題。不要忘記那個IPC$共享哦。沒有權限訪問IPC$就無法使用命名管道。可以運行“net use? \\servername\IPC$ ”命令測試一下。
?
大多數情況下這個錯誤是因為你使用了權限不足的賬號登錄客戶端機器,而你又使用Windows authentication?訪問SQL Server?引起。比方說你使用客戶端機器的本地帳號登錄,同時使用了windows authentication方式訪問SQL Server。 由于客戶端本地帳號沒有權限訪問服務器的資源,必然會導致訪問失敗。 解決方法就是使用域的帳號重新登錄客戶端機器,同時確保該域帳號已經加入到SQL Server?的login里面。還有另外一個方法就是使用SQL Server?帳號而不是windows帳號嘗試連接SQL Server,并且使用TCP/IP?協議。不要忘了,即使使用SQL帳號,如果協議是命名管道,也是需要Windows?認證的。
?
連接問題三:
Login failed for user 'User123'.
?
這類問題多是User123沒有權限訪問服務器的資源,或沒有權限訪問SQL Server。應該不是一個連接問題而是一個SQL Server訪問權限(即SQL Server的身份驗證)問題了?J
?
八.?友情貼士(Tips)
1.連接建立后,如何查看使用的協議呢?可以在SQL Server 2000的Query Analyzer或者SQL Server 2005/2008得Management Studio中運行如下語句:
?
Select Net_library, hostname, program_name, nt_domain, nt_username,??loginame from
master..sysprocesses where spid>50
?
其中的net_library字段說明該連接使用的協議。注意如果你看到協議是LPC,那么它代表是使用shared memory?連接的。
?
2.當使用來自?SQL Server 7.0?或其早期版本的?SQL Server?客戶端連接組件時,在連接到?SQL Server 2000?的命名實例之前,必須使用客戶端網絡實用工具設置別名.另一個方法是安裝MDAC 2.6或以后更高的MDAC版本.只有MDAC2.6或更高版本才有能力不用客戶端別名連接到SQL Server 2000的命名實例.
?
3.除了使用SQL Server查詢分析器(Query Analyzer)測試SQL Server?的連接問題外,?另一個更好的測試工具是ODBC數據庫源.?運行ODBCAD32.exe即可調出該工具.使用該工具可以嘗試建立連接到SQL server?的系統DSN.?為什么說ODBCAD32.exe工具比較好呢?因為它輸出的信息比Query Analyzer的要詳細.
?
比方說連接到不存在的服務器, Query Analyzer中輸出的信息是:
?
?
而如果ODBC數據源建立ODBC DSN來測試,?輸出的信息是:
???
?
這個信息不但指出了連接使用的協議,而且顯示了一個重要的錯誤號碼如上圖的53.
如果使用?NET Helpmsg?查看錯誤號53,你會發現:
?
Net helpmsg 53
The network path was not found.
?
既然是network path not found,?很明顯是網絡的連通性問題了.
?
4.?命名管道也可以說是基于命名文件系統?NPFS(Named Pipe File System)來實現的,相關的驅動程序有npfs.sys等.有興趣的讀者可自行研究.
?
5.最后貼一個從SQL Server?聯機手冊里面的一張通訊組件圖,希望對理解SQL Server?的連接問題有幫助:
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
