Attribute | 值 |
---|---|
产品名称 | SQL Server |
事件 ID | 35250 |
事件源 | MSSQLSERVER |
组件 | SQLEngine |
符号名称 | HADR_PRIMARYNOTACTIVE |
消息正文 | 到主要副本的连接处于非活动状态。 无法处理该命令。 |
尝试将辅助数据库联接到 Always On 可用性组时,会出现此消息。 如果无法连接到终结点,则通常会导致此错误。
在 Azure Data Studio 中打开笔记本
了解如何安装 Azure Data Studio
备注
必须在主要副本和有问题的次要副本上都运行下列所有步骤。
运行以下查询来发现终结点
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
使用 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 连接使用 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
可查询 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)'
在主要副本上运行以下查询,然后在无法连接的每个次要副本上运行此查询。 这将帮助你查找终结点 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。
运行以下查询,以列出对相关服务器上的终结点具有连接权限的帐户,并显示分配给每个相关终结点的权限。
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;
对 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:WINDOWSsystem32driversetchosts
Get-Content 'C:WINDOWSsystem32driversetchosts'
检查是否有可供副本上定义的客户端使用的服务器别名
有关详细信息,请查看创建可用性组失败,出现错误 35250“未能联接数据库”