MSSQLSERVER_35250

適用対象: SQL Server

詳細

属性 Value
製品名 SQL Server
イベント ID 35250
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 HADR_PRIMARYNOTACTIVE
メッセージ テキスト プライマリ レプリカへの接続がアクティブではありません。 コマンドを処理できません。

説明

このメッセージは、セカンダリ データベースを Always On 可用性グループに参加させようとしたときに発生します。 通常は、エンドポイントに接続できないときに、このエラーが発生する可能性があります。

ユーザーの操作

オプション 1: Azure Data Studio を利用してノートブックで直接、手順を実行する

Azure Data Studio をインストールする方法を知る

オプション 2: 手動で手順を行う**

Note

次のすべてのステップを、プライマリ レプリカと問題のあるセカンダリ レプリカの両方で実行する必要があります。

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 インスタンス) に定義されている可能性があります。 問題のインスタンスのエンドポイントの状態は "STARTED" と表示されますが、実際には別のインスタンスがポートのバインドを持ち、正しいインスタンスが 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:Port の状態が LISTENING または ESTABLISHED であることを確認します

    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 のポートと一致することを確認します

    Note

    リッスンするエンドポイントに特定の IP アドレスを使用している場合、既定の "listen all" ではなく、FQDN ではなく特定の IP アドレスを使用する 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 アドレスは正しい名前に解決されますか?

  • 各ノードで、無効なサーバーを指している可能性のあるローカル ホスト ファイルのエントリがないかどうかを確認します。 コマンド プロンプトで、次を使用してホスト ファイルを出力します。

    type C:\WINDOWS\system32\drivers\etc\hosts
    
    Get-Content 'C:\WINDOWS\system32\drivers\etc\hosts'
    
  • クライアントによって使用されるサーバーの別名がレプリカに定義されているかどうかを確認します

7. SQL Server で最近のビルド (最新のビルド を推奨) が確実に実行されているようにします

  • SQL Server のバージョンを更新して、KB3213703 のような問題が発生しないようにします。

詳細については、「可用性グループの作成がエラー 35250 ' データベースの結合に失敗しました' により失敗する」を参照してください