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 ' データベースの結合に失敗しました' により失敗する」を参照してください