共用方式為


MSSQLSERVER_35250

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 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 實例可能)設定為接聽該埠。 雖然有問題的實例上的端點狀態顯示「STARTED」另一個實例實際上可能會有埠系結,並防止正確的實例接聽和建立 TCP 連線。 若要尋找埠 5022 的擁有程式,請執行下列命令:

    $port = "5022"
    Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
    

封鎖的端點(防火牆、防病毒軟體)

  • 如果 telnetTest-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:Port 上的 LISTENING 或已建立

    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.檢查系統中的錯誤

  • 您可以針對 last_connect_error_number 查詢 sys.dm_hadr_availability_replica_states,可能可以協助您診斷聯結問題。 根據哪些復本通訊困難,您可以查詢主要和次要複本:

    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「無法聯結資料庫」