代码改变世界

SQL Server隐藏实例会导致Alwasy on手动故障转移时报error 26

2024-02-28 11:17  潇湘隐者  阅读(36)  评论(0编辑  收藏  举报

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