この記事では、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) のメモリ不足を引き起こす可能性があります。