一、官網關於SQL SERVER Browser服務的解釋(谷歌翻譯後稍作修改的): https://docs.microsoft.com/en-us/sql/tools/configuration-manager/sql-server-browser-service 背景: 在SQL Server ...
一、官網關於SQL SERVER Browser服務的解釋(谷歌翻譯後稍作修改的): https://docs.microsoft.com/en-us/sql/tools/configuration-manager/sql-server-browser-service 背景: 在SQL Server 2000之前,只能在電腦上安裝一個SQL Server實例。 SQL Server通過官方互聯網號碼分配機構(IANA)偵聽埠1433上的傳入請求,然後分配給SQL Server。只有一個實例可以使用這個埠,所以當SQL Server 2000引入了對多個SQL Server實例的支持時,開發了SQL Server解析協議(SSRP)來偵聽UDP埠1434。該監聽器服務響應客戶端對所有已安裝實例的帶實例名字的請求,返回實例們所使用的埠號和命名管道。為瞭解決SSRP系統的局限性,SQL Server 2005引入了SQL Server Browser服務作為SSRP的替代品。 SQL Server Browser的工作原理: 當SQL Server實例啟動時,如果TCP / IP協議啟用,則會為伺服器分配一個TCP/IP埠。如果命名管道協議啟用,SQL Server將偵聽特定的命名管道。該埠或“管道”被該特定實例用於與客戶端應用程式交換數據。在安裝過程中,TCP埠1433和pipe \sql\query分配給預設實例,但之後可以由伺服器管理員使用SQL Server Configuration Manager更改這些實例。因為只有一個SQL Server實例可以使用預設埠或管道,所以為命名實例(包括SQL Server Express)分配不同的埠號和管道名稱。 預設情況下,命名實例和SQL Server Express實例啟動時配置為使用動態埠,即SQL Server啟動時分配可用埠。如果需要,可以將特定埠分配給SQL Server實例。連接時,客戶端可以指定特定埠;但是如果埠是動態分配的,則在SQL Server重新啟動時,埠號可以隨時更改,因此客戶端不知道正確的埠號。 SQL Server Browser啟動時,配置使用UDP埠1434。SQL Server Browser讀取註冊表,標識電腦上的所有SQL Server實例,並記下使用的埠和命名管道。當伺服器有兩個或更多網卡時,SQL Server瀏覽器將返回第一個啟用的SQL Server埠。 SQL Server瀏覽器支持ipv6和ipv4。 當SQL Server客戶端請求SQL Server資源時,客戶端網路庫使用埠1434向伺服器發送UDP消息。SQL Server Browser會使用所請求實例的TCP / IP埠或命名管道進行響應。然後,客戶端應用程式上的網路庫通過使用所需實例的埠或命名管道向伺服器發送請求來完成連接。 二、個人實驗: 從官網的解釋來看,SQL Server Browser是為解決多實例情況下,非預設實例使用動態埠號的情況。因此實例重啟後,客戶端可能無法連接命名實例。因此需要開啟SQL Server Browser服務來使用UDP的1434埠監聽本伺服器所有命名實例,併為客戶端請求返回命名實例所使用的真實埠或命名管道。 1)實驗環境 SQL Server 2008R2版本,安裝了預設實例MSSQLSERVER和命名實例TEST,其中預設實例使用預設的1433埠,TEST使用預設的動態分配埠。 實驗過程中主要觀察: 1、是否可以使用sqlcmd聯通 2、netstat -ano的埠占用情況 2)實驗說明: 開啟SQL Server Browser服務等同於開啟UDP的1434埠。而且如果將預設實例的埠換為1434,Browser服務依然使用UDP1434埠,不會改變。 3)實驗步驟 1.只開啟兩個實例的服務,預設實例使用1433埠,TEST實例使用動態埠,用sqlcmd遠程嘗試連接兩個實例的的結果如下: 2.開啟SQL Server Browser服務之後: 此時如果關閉SQL Server Browser: sqlcmd -S 192.168.111.69\TEST -U sa -P Leo123 依然會成功,但是將動態埠號設置為0後重啟服務就會失敗,說明只要啟動過一次Browser服務且資料庫服務沒重啟過(這意味著動態埠號沒變過)就一直可以連通。 3.將預設實例的埠號改為動態埠: sqlcmd -S 192.168.111.69\MSSQLSERVER -U sa -P Leo123 無論Browser服務是否開啟,都無法連接。 說明此服務對預設實例無效。 4)實驗結論 SQL Server Browser只負責使用UDP的1434埠轉發使用動態埠的命名實例的信息給客戶端,預設實例必須使用固定埠,並告知客戶端。 因此如果伺服器上有多個實例,且命名實例使用動態埠,那麼一定要開啟Browser服務。 對使用固定埠1433連接伺服器的程式來說,如果是命名實例,那麼最好設置固定的埠號,並修改配置文件使用新的固定埠號連接。此時可以關閉Browser服務。 在集群環境中,應保證Browser服務在所有節點始終開啟。 最後,也希望大家不要迷信這個實驗結論,不保證能解釋所有問題,要自己動手驗證。 三、一些附加信息: 1.可以使用netstat -ano|findstr PID來查看SQL Server監聽的埠號,其中[: :]表示所有IP地址,[: : 1]表示127.0.0.1 2.如何修改SQL Server實例的預設埠號: 修改下圖的IPALL即可,動態埠設為空表示使用固定埠,設為0表示使用動態埠。