状態 または エラー ID が 29 のエラー 18056

 

神谷 雅紀
Escalation Engineer

 

先月から今月にかけて非常に問い合わせ数が多く、約 1 ヶ月ぶりのポストになりますが、今回は、ここ最近連続で問合わせのあったエラー 18056 状態 29 についてです。

 

エラーメッセージ

エラー: 18056, 重大度: 20, 状態:29 クライアントは、接続プーリング用にリセットされた SPID nn のセッションを再利用できませんでした。エラー ID は 29 です。このエラーは以前の操作の失敗が原因で発生した可能性があります。エラー ログで、このエラー メッセージの直前に失敗した操作を確認してください。

Error: 18056, Severity: 20, State: 29 The client was unable to reuse a session with SPID nn, which had been reset for connection pooling. The failure ID is 29. This error may have been caused by an earlier operation failing. Check the error logs for failed operations immediately before this error message.

 

状態およびエラー ID は、どのような原因でエラー 18056 となったかを示しています。

 

エラー 18056, 状態 29 / エラー ID 29 が示す状況

 

エラー ID 29 の 18056 エラーは、プールされているセッションを再利用してログインしようとしたときに、何らかの例外が発生したことを示しています。

Errorlog ファイルに、18056 エラーの前に他のエラーが記録されていない場合、その原因は、タイムアウトによるログイン処理のキャンセルです。

タイムアウトによるログイン処理の中断は、ログイン要求しているクライアントがログイン処理を中断するための Attention メッセージを SQL Server に送信することで行われます。SQL Server 側では、Attention メッセージを受け取ると、それは例外に変換されて処理されます。その例外を処理している最中にエラー 18056 状態 29 が Errorlog に記録されます。

※ SQL Server データベースエンジン内でのエラー処理は、例外を発生させ、その例外処理することで行われます。Attention も例外として処理されます。

 

クライアント側で受け取るエラー

 

プールされたセッションを再利用し、SQL Server に実際にアクセスが行われるのはクエリ実行時です。そのため、この状況の 18056 エラー発生時には、クライアント側はクエリタイムアウトになっています。アプリケーションが受け取ったエラーをファイル等に書き出している場合は、そのファイルに記録されているエラーの内容を確認してみて下さい。タイムアウトのメッセージは、使用しているデータアクセスインタフェースや実行メソッドの種類により異なりますが、タイムアウトを示す内容、もしくは、ログイン処理が失敗したことを示すメッセージです。一例ですが、.NET Framework Data Provider for SQL Server を使用している場合には以下のメッセージが返されます。

 

タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。

 

対処の必要性

 

このエラーは、タイムアウトの発生を示すだけですので、SQL Server においては特に対処の必要はなく、無視して問題のないエラーです。

クライアント側では、接続の確立から再試行する、クエリタイムアウト値を長く設定するなどの方法で対処します。

 

対象バージョン

 

SQL Server 2005
SQL Server 2008
SQL Server 2008 R2
SQL Server 2012