この記事では、SQL Server 接続での断続的な認証の問題の一般的な原因について説明し、解決策を示します。
現象
SQL Server 接続の断続的または定期的な認証の問題は、ユーザーまたはアプリケーションが SQL Server データベースでの認証に散発的な困難に直面した場合に発生します。 これにより、データ アクセスとアプリケーション機能が中断されます。
最も一般的なエラー メッセージ
-
-
- ユーザー '' はログインできませんでした
- ユーザー 'NT AUTHORITY\ANONYMOUS LOGON' はログインできませんでした。
- ユーザー '<UserName>' のログインに失敗しました
- ユーザー '<Domain>\<UserName>' のログインに失敗しました
- ログインできませんでした。 ログインは信頼されていないドメインからのものであり、Windows 認証では使用できません。
原因
最も一般的な問題は、SQL Server のパフォーマンスまたはドメイン コントローラーの応答が遅い場合に発生します。 NT LAN Manager (NTLM)を使用している場合、ローカル セキュリティ機関サブシステム サービス (LSASS) にボトルネックがあり、一度に処理できる新しい接続の数が制限されます。 その他の要求はバックアップされ、タイムアウトになる可能性があります。ウイルス対策などの一部の原因は証明が難しい場合がありますが、それでも一般的であり、他の調査手段が効果的でない場合は、厳しい証拠がなくても調査する必要があります。
トラブルシューティング手順
問題は断続的であるため、Kerberos サービス プリンシパル名 (SPN) などの構成が正しい可能性があります。 この問題を解決するには、次のトラブルシューティング手順を試してください。
複数のドメインまたはデータ センター間の待機時間の違い
複数のドメインまたはデータ センターが関係している場合は、ローカル ドメインまたはデータ センターのユーザーに問題が発生していないかどうかを確認します。他のドメインまたはデータ センターのユーザーが問題を発生させないようにします。 その場合は、データ センターまたはドメイン コントローラー間の通信待ち時間を示している可能性があります。 次のコマンドを使用して問題を調査します。
ネットワーク待機時間を確認するには、 pingを使用します。 例えば次が挙げられます。
コマンド
ping <DatabaseServer>
を実行します。時間列を見て、その時刻を他のドメインまたはデータ センターの時刻と比較します。
Pinging <DatabaseServer> [10.10.10.3] with 32 bytes of data: Reply from 10.10.10.3: bytes=32 time=68ms TTL=116 Reply from 10.10.10.3: bytes=32 time=67ms TTL=116 Reply from 10.10.10.3: bytes=32 time=67ms TTL=116
資格情報検証の待機時間の問題をテストするには、さまざまなユーザーと共に Runas を使用します。 例えば次が挙げられます。
runas /user:<DomainName>\<UserAccountName> cmd.exe
を実行します。- コマンド プロンプトが表示されたら、ユーザーのパスワードを入力します。
これらのコマンドを使用してテストしても問題が解決しない場合、問題は SQL Server ではなく、ネットワーク インフラストラクチャまたはドメイン コントローラーのパフォーマンスにあります。
SQL Server エラー ログでパフォーマンスの問題を探す
SQL Server エラー ログでは、I/O に 15 秒を超える時間がかかることを示すエントリなど、SQL Server のパフォーマンスの問題が表示される場合があります。 SQL パフォーマンス チームは、 PSSDIAG を実行して分析します。 ネットワーク トレースで SQL Server 応答の遅延が明らかになった場合は、これを行う必要がある場合があります。
エラー ログには、Active Directory のパフォーマンスの問題を示す次のエラー ログなど、ドメイン関連のその他のエラーも含まれる場合があります。
SSPI handshake failed with error code 0x80090311 while establishing a connection with integrated security; the connection has been closed.
SSPI handshake failed with error code 0x80090304 while establishing a connection with integrated security; the connection has been closed.
次のオペレーティング システムのエラー コードは、エラーの原因を示しています。
-
エラー -2146893039 (0x80090311): 認証に対して機関に接続できませんでした。
-
エラー -2146893052 (0x80090304): ローカル セキュリティ機関に接続できません。
クライアント システムのイベント ログでネットワーク エラーを確認する
システム イベント ログには、Kerberos、ローカル セキュリティ機関 (LSA)、Netlogon イベントなど、さまざまなイベントがあります。 これらのイベントは、コンピューターがしばらくの間ドメイン コントローラーに接続できないことを示します。 見つけやすくするには、 Error、、 Warning、および Critical イベントのみをフィルター処理します。 イベント時間は、停止の時間の前後である必要があります。 一致するものがある場合は、Active Directory の問題である可能性があります。
場合によっては、この問題が SQL Server で発生する可能性があります。 そのマシンのログも確認します。
Source: NETLOGON
Date: <DateTime>
Event ID: 5719
Task Category: None
Level: Error
Keywords: Classic
User: N/A
Computer: SQLPROD01
Description:
This computer was not able to set up a secure session with a domain controller in domain CONTOSO due to the following: The remote procedure call was cancelled. This may lead to authentication problems. Make sure that this computer is connected to the network. If the problem persists, please contact your domain administrator.
セキュリティ イベント ログで、 Event ID 4625 をフィルター処理します。 このイベントには、ログインエラーに関する詳細情報が表示されます。
SQL 接続リング バッファーを収集して確認する
リング バッファーは、SQL Server 上の接続イベントの履歴ログです。これは、障害が発生した後に取得できることを意味します。 多くのイベントには、時間が費やされた場所を示すログイン タイマーが含まれます。
- ネットワークに費やされた時間は、ネットワークまたはクライアントの待機時間の可能性を示します。
- Secure Sockets Layer (SSL) またはセキュリティ サポート プロバイダー インターフェイス (SSPI) API に費やされた時間は、Windows セキュリティ サブシステムに関する潜在的な問題を示します。
- エンキュー時間は、SQL Server のパフォーマンスの問題を示します。
詳細については、「 接続リング バッファーを収集するを参照してください。
接続プール
接続プールがないと、断続的なログイン エラーが発生する可能性があります。
Note
接続プールが不足すると、確立された接続と比較して、NETSTAT
出力に多数のTIME_WAIT
状態コードが表示されます。
接続プールが有効になっていない場合、クライアントが送信ポートを使い果たしたり、サーバーをオーバーロードしたりすることがあります。 このオーバーロードにより、サーバーは受信接続要求を拒否したり、パフォーマンスの低いドメイン コントローラーをあふれさせたりする可能性があります。
最善の方法は、アプリケーション開発者にアプリケーションで接続プールを使用してもらうことです。 .NET および インターネット インフォメーション サービス (IIS) アプリケーションでは、接続プールは既定で ON になっていますが、何らかの理由でオフになっている可能性があります。
アプリケーションでカスタム プーリング コードを使用することは強くお勧めします。 発生したすべてのカスタム プールの実装に問題がありました。 組み込みの接続プール メカニズムを使用することをお勧めします。
カーネル メモリの不足に関連する問題
一時的なポートの不足は、断続的な接続タイムアウトの比較的一般的な原因です。
問題: SQL Server マシンのカーネル メモリが不足しています。
解決策: SQL Server Management Studio の Properties ペインで、max サーバー メモリ (MB) を調整します。 max サーバー メモリ (MB) をマシン上の物理メモリより約 4 GB から 8 GB 小さく設定することをお勧めします。 マシン上で複数のインスタンス、IIS、またはその他のアプリケーション サーバーが実行されている場合は、この値を小さくする必要があります。 max サーバー メモリ (MB) の設定に関する推奨事項については、「サーバー メモリ構成オプションを参照してください。
Note
既定値は 2147483647 MB
です。つまり、サーバーがオペレーティング システム (OS) のメモリ不足を引き起こす可能性があります。