MSSQLSERVER_35250

适用范围:SQL Server

详细信息

Attribute
产品名称 SQL Server
事件 ID 35250
事件来源 MSSQLSERVER
组件 SQLEngine
符号名称 HADR_PRIMARYNOTACTIVE
消息正文 到主要副本的连接处于非活动状态。 无法处理该命令。

说明

尝试将辅助数据库联接到 Always On 可用性组时,会出现此消息。 如果无法连接到终结点,则通常会导致此错误。

用户操作

选项 1:通过 Azure Data Studio 直接在笔记本中执行这些步骤

了解如何安装 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. 检查是否可连接到终结点

  • 使用 telnetTest-NetConnection 验证连接性。 如果终结点正在侦听且连接成功,则 telnet 将显示一个包含闪烁游标的空白屏幕。 否则,你将收到来自 Telnet 的连接错误。 要退出成功的 Telnet 连接,请按 CTRL+]。 如果使用 Test-NetConnection,请查找 TcpTestSucceeded : TrueTcpTestSucceeded : 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
    
  • 捕获 netstatGet-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 地址和名称使用 nslookupResolve-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“未能联接数据库”