SQLServer 错误 35250 到主要副本的连接处于非活动状态。 无法处理该命令。 故障 处理 修复 支持远程
详细信息
Attribute | 值 |
---|---|
产品名称 | SQL Server |
事件 ID | 35250 |
事件源 | MSSQLSERVER |
组件 | SQLEngine |
符号名称 | HADR_PRIMARYNOTACTIVE |
消息正文 | 到主要副本的连接处于非活动状态。 无法处理该命令。 |
说明
尝试将辅助数据库联接到 Always On 可用性组时,会出现此消息。 如果无法连接到终结点,则通常会导致此错误。
用户操作
选项 1:通过 Azure Data Studio 直接在笔记本中执行这些步骤
选项 2:手动执行步骤**
备注
必须在主要副本和有问题的次要副本上都运行下列所有步骤。
1. 请确保终结点已创建且已启动。
-
运行以下查询来发现终结点
SELECT tep.name as EndPointName, sp.name As CreatedBy, tep.type_desc, tep.state_desc, tep.port FROM sys.tcp_endpoints tep INNER JOIN sys.server_principals sp ON tep.principal_id = sp.principal_id WHERE tep.type = 4
警告
执行下一命令时请小心,因为它可能导致副本暂时出现故障。
-
可使用这些命令来重启你发现的终结点
ALTER ENDPOINT hadr_endpoint STATE = STOPPED ALTER ENDPOINT hadr_endpoint STATE = STARTED
2. 检查是否可连接到终结点
-
使用 telnet 或 Test-NetConnection 验证连接性 。 如果终结点正在侦听且连接成功,则 telnet 将显示一个包含闪烁游标的空白屏幕。 否则,你将收到来自 Telnet 的连接错误。 要退出成功的 Telnet 连接,请按 CTRL+]。 如果使用 Test-NetConnection,请查找
TcpTestSucceeded : True
或TcpTestSucceeded : False
。telnet ServerName <port_number> telnet IP_Address <port_number>
Test-NetConnection -ComputerName <ServerName> -Port <port_number> Test-NetConnection -ComputerName <IP_address> -Port <port_number>
DNS 问题:
- 如果 telnet/Test-NetConnection 到 IP 地址的连接成功,但到 ServerName 的连接失败,则可能是 DNS 或名称解析问题 。 请参阅检查名称解析问题
多个进程侦听同一端口
-
如果 telnet/Test-NetConnection 连接使用 ServerName 时正常运行,但使用 IP 地址时失败,则在该服务器(可能是另一 SQL 实例)上可能定义了多个终结点,它们均配置为侦听该端口 。 虽然存在问题的实例上终结点的状态显示“已启动”,但另一实例实际上可能具有端口绑定,并阻止正确的实例侦听和建立 TCP 连接。 例如,若要查找端口 5022 的拥有进程,请运行以下命令:
$port = "5022" Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
阻止的终结点(防火墙、防病毒)
-
如果 Telnet 或 Test-NetConnection 连接失败,请查找可能阻止相关终结点端口的防火墙和/或防病毒软件 。 检查防火墙设置,查看是否允许在承载主副本的服务器实例与辅助副本之间进行终结点端口通信(默认情况下为端口 5022)。 如果正在 Azure VM 上运行 SQL Server,则还需要确保网络安全组 (NSG) 允许流量流向终结点端口。 检查防火墙设置(对于 Azure VM,请查看 NSG 设置),查看是否允许在承载主副本的服务器实例与辅助副本之间进行终结点端口通信(默认情况下为端口 5022)
运行以下 PowerShell 脚本,检查是否有已禁用的入站流量规则
Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
-
捕获 netstat 或 Get-NetTCPConnection 输出,验证在指定的终结点的“IP:端口”上状态是否为“正在侦听”或“已建立”
netstat -a
Get-NetTCPConnection -LocalPort <port_number>
-
还可以找到端口拥有进程:运行类似于此 (的命令,例如使用端口 5022)
$port = "5022" Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
3. 检查系统中是否有错误
-
可查询 sys.dm_hadr_availability_replica_states,查看可能有助于你诊断联接问题的 last_connect_error_number。 根据哪个副本存在通信困难,你可查询主要副本和次要副本:
select r.replica_server_name, r.endpoint_url, rs.connected_state_desc, rs.last_connect_error_description, rs.last_connect_error_number, rs.last_connect_error_timestamp from sys.dm_hadr_availability_replica_states rs join sys.availability_replicas r on rs.replica_id = r.replica_id where rs.is_local = 1
例如,如果次要副本无法与 DNS 服务器通信,或者在创建可用性组时副本的 endpoint_url 配置错误,那么你可能在 last_connect_error_description 中获得以下结果:
DNS Lookup failed with error '11001(No such host is known)'
4. 请确保为针对其定义了 AG 的正确 IP/端口配置终结点
-
在主要副本上运行以下查询,然后在无法连接的每个次要副本上运行此查询。 这将帮助你查找终结点 URL 和端口
select endpoint_url from sys.availability_replicas
-
运行以下查询来查找终结点和端口
SELECT tep.name as EndPointName, sp.name As CreatedBy, tep.type_desc, tep.state_desc, tep.port FROM sys.tcp_endpoints tep INNER JOIN sys.server_principals sp ON tep.principal_id = sp.principal_id WHERE tep.type = 4
-
比较每个查询的 endpoint_url 和端口,确保来自 endpoint_url 的端口与为每个相应副本上的终结点定义的端口匹配
备注
如果使用特定 IP 地址来侦听终结点,而不是默认的“全部侦听”,则可能需要定义使用特定 IP 地址而不是 FQDN 的 URL。
5. 检查网络服务帐户是否拥有对终结点的 CONNECT 权限
-
运行以下查询,以列出对相关服务器上的终结点具有连接权限的帐户,并显示分配给每个相关终结点的权限。
SELECT perm.class_desc, prin.name, perm.permission_name, perm.state_desc, prin.type_desc as PrincipalType, prin.is_disabled FROM sys.server_permissions perm LEFT JOIN sys.server_principals prin ON perm.grantee_principal_id = prin.principal_id LEFT JOIN sys.tcp_endpoints tep ON perm.major_id = tep.endpoint_id WHERE perm.class_desc = 'ENDPOINT' AND perm.permission_name = 'CONNECT' AND tep.type = 4; SELECT ep.name, sp.state, CONVERT(nvarchar(38), suser_name(sp.grantor_principal_id)) AS grantor, sp.TYPE AS permission, CONVERT(nvarchar(46),suser_name(sp.grantee_principal_id)) AS grantee FROM sys.server_permissions SP INNER JOIN sys.endpoints ep ON sp.major_id = ep.endpoint_id AND EP.type = 4 ORDER BY Permission,grantor, grantee;
6. 检查名称解析问题
-
对 IP 地址和名称使用 nslookup 或 Resolve-DnsName 来验证 DNS 解析 :
nslookup <IP_Address> nslookup <ServerName>
Resolve-DnsName -Name <ServerName> Resolve-DnsName -Name <IP_address>
-
名称是否解析为正确的 IP 地址? IP 地址是否解析为正确的名称?
-
检查每个节点上是否有可能指向错误服务器的本地 HOSTS 文件条目。 在命令提示符下,使用以下命令打印 HOSTS 文件:
type C:\WINDOWS\system32\drivers\etc\hosts
Get-Content 'C:\WINDOWS\system32\drivers\etc\hosts'
-
检查是否有可供副本上定义的客户端使用的服务器别名
7. 确保 SQL Server 正在运行近期版本(最好是最新版本)
- 更新 SQL Server 版本以防止遇到诸如 KB3213703 之类的问题。
有关详细信息,请查看创建可用性组失败,出现错误 35250“未能联接数据库”