SQL Server隱藏例項會導致Alwasy on手動故障轉移時報error 26

潇湘隐者發表於2024-02-28

SQL Server的配置管理器(SQL Server Configuration Manager)下,你可以隱藏資料庫例項,設定了隱藏例項後, SQL Server Browser不會對此伺服器例項的相關資訊做出響應,(當 SQL Server 客戶端請求 SQL Server 資源時,客戶端將使用 1434 埠向伺服器傳送一條 UDP 訊息。SQL Server 瀏覽器將用請求的例項的 TCP/IP 埠或命名管道做出響應。然後,客戶端應用程式將使用所需例項的埠或命名管道向伺服器傳送請求來完成連線。),此時,如果你沒有提供正確的埠號或命名管道,由於SQL Server Browser又不會對客戶端的連線做出響應,那麼除非你指定例項名和埠號,否則就會連線不上SQL Server。有些公司的安全規範,會要求設定隱藏SQL Server例項。這樣防止別人掃描獲取SQL Server資料庫例項資訊。

如何隱藏SQL Server例項:

  1. 在“SQL Server 配置管理器”中,展開“SQL Server 網路配置”、右鍵單擊“<伺服器例項> 的協議”,然後選擇“屬性”。

  2. 在 “標誌” 選項卡的 “隱藏例項” 框中,選擇 “是” ,然後單擊 “確定” 關閉對話方塊。 對於新連線,更改會立即生效

如果SQL Server AlwaysOn的例項設定隱藏例項後,手動故障轉移時,你可能連線不到輔助節點。此時你可能遇到下面錯誤(這裡的測試環境為SQL Server 2019, Tcp埠設定為靜態埠14033): SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified

遇到這個錯誤的時候,一般會從下面幾個方面去排查:

  1. 確保伺服器名稱或IP正確無誤,例如,伺服器名稱上沒有錯別字。
  2. 確保例項名稱(Server Instance)正確無誤。
  3. 確保伺服器機器是可訪問的,例如,DNS可以正確解析,你可以ping伺服器(並不總是true)。
  4. 確保 SQL Browser 服務正在伺服器上執行。
  5. 如果在伺服器上啟用了防火牆,則需要將sqlbrowser.exe和/或UDP埠1434置於例外狀態。

這幾方面都排查過後,檢測發現1434 UDP埠狀態異常,防火牆也放開了UDP 1434埠

SQL Server隱藏例項的情況

C:\PortQryUI>portqry.exe -n 192.168.63.217 -p udp  -e 1434

Querying target system called:

192.168.63.217

Attempting to resolve IP address to a name...


IP address resolved to ****

querying...

UDP port 1434 (ms-sql-m service): LISTENING or FILTERED

Sending SQL Server query to UDP port 1434...

UDP port 1434 (ms-sql-m service): FILTERED

SQL Server取消隱藏例項的情況

C:\PortQryUI>portqry.exe -n 192.168.63.217 -p udp  -e 1434

Querying target system called:

192.168.63.217

Attempting to resolve IP address to a name...


IP address resolved to ****

querying...

UDP port 1434 (ms-sql-m service): LISTENING or FILTERED

Sending SQL Server query to UDP port 1434...

Server's response:

ServerName ****
InstanceName MSSQLSERVER
IsClustered No
Version 15.0.2000.5
tcp 14033



==== End of SQL Server query response ====

UDP port 1434 is LISTENING

官方文件[1]還提示,隱藏例項可能會導致“故障轉移群集資源死鎖”,如下所示:

如果隱藏群集命名例項,當 LastConnect 登錄檔項 (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI11.0\LastConnect) 具有的埠與SQL Server 正在偵聽的埠不同時,群集服務可能無法連線到 SQL Server。 如果群集服務無法建立與 SQL Server的連線,則你可能會看到類似於以下內容的錯誤:

事件 ID:1001:事件名稱:故障轉移群集資源死鎖

參考資料

[1]

官方文件: https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/hide-an-instance-of-sql-server-database-engine?view=sql-server-ver16

相關文章