SQL Server への接続時に有効期限が切れたメッセージのタイムアウト
適用対象: SQL Server
Note
トラブルシューティングを開始する前に、 前提条件を確認し チェックリストを確認してください。
タイムアウト エラーは、特定の操作に必要以上に時間がかかることを意味します。 クライアント アプリケーションは、(無期限に待機するのではなく) 操作を停止します。この操作により、他の操作がブロックされ、アプリケーションが中断される可能性があります。 この記事では、SQL Server に接続するときに受け取る "コマンド タイムアウト" エラーと "接続タイムアウト" エラーの解決策について説明します。
タイムアウト期限切れのエラーを確認する
"タイムアウト期限切れ" の問題が発生すると、次のエラー メッセージが 1 つ以上表示されます。
-
タイムアウトに達しました。 処理が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
-
System.Data.SqlClient.SqlException (0x80131904): 接続タイムアウトの有効期限が切れています。 ログイン前のハンドシェイク確認応答を使用しようとしている間に、タイムアウト期間が経過しました。 これは、ログイン前のハンドシェイクに失敗したか、サーバーが時間内に応答できなかったことが原因と考えられます。 このサーバーへの接続の試行に費やされた時間は、[ログイン前] 初期化 = 23; ハンドシェイク = 14979;
System.ComponentModel.Win32Exception (0x80004005): 待機操作がタイム アウトしました。 -
System.Data.SqlClient.SqlException (0x80131904): タイムアウトの有効期限が切れています。 処理が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。 System.ComponentModel.Win32Exception (0x80004005): 待機操作がタイム アウトしました。
-
接続がタイムアウトしました。 ログイン前のハンドシェイク確認応答を使用しようとしている間に、タイムアウト期間が経過しました。 これは、ログイン前のハンドシェイクに失敗したか、サーバーが時間内に応答できなかったことが原因と考えられます。
このサーバーへの接続中に費やされた時間は[ログイン前]初期化=21036でした。handshake=0;(Microsoft SQL Server、エラー: -2)。 -
System.InvalidOperationException: タイムアウトの有効期限が切れています。 pool から接続を取得するまでに経過したタイムアウト時間。
接続が正しく閉じられていない場合は、エラーが発生する可能性があります。 これらのエラーは、プールされたすべての接続が使用中であり、最大プール サイズに達したために発生します。 接続プールの に関する記事で説明されている手順に従うと これらのエラーを回避できます。
Note
2 番目と 3 番目のエラーは、.NET Framework 4.5 以降のバージョンがインストールされている場合に発生します。
タイムアウト期限切れのエラーの種類を確認する
接続の観点から、次のタイムアウトの問題が発生します。
- 接続タイムアウト (既定では 15 秒)
- クエリまたはコマンドのタイムアウト (既定では 30 秒)
Note
既定値は、コード、接続文字列、またはその他のメソッドを使用して設定できます。
トラブルシューティングを行う前に、エラー メッセージの完全な呼び出し履歴を表示して、エラーの種類を特定します。
接続タイムアウトの呼び出し履歴の次の例を参照してください。
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt,Boolean trustServerCert, Boolean& marsCapable) at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnectionowningObject) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfoserverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open()
SqlConnection.Open
は、クライアントが接続を開こうとしているため、クエリに関連していないことを示します。クエリまたはコマンド タイムアウトの呼び出し履歴の次の例を参照してください。
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteScalar()
SqlCommand
クラスは、接続ではなくクエリを操作するために使用されます。ExecuteScalar
メソッドは、クエリの実行に使用されます。ExecuteReader
やExecuteNonQuery
など、他の項目も表示できます。
タイムアウト期限切れのエラーのトラブルシューティング
クエリまたはコマンド タイムアウト エラーが発生した場合は、「 クエリタイムアウト エラーをトラブルシューティングするを参照してください。
接続タイムアウト エラーが発生した場合は、次の手順に従います。
接続タイムアウト パラメーターを増やします。
アプリケーションを使用して SQL Server に接続する場合は、関連する接続タイムアウト パラメーター値を増やし、最終的に接続が成功するかどうかを確認します。 たとえば、
System.Data.SqlClient
を使用する場合は、 SqlConnection.ConnectionTimeout プロパティを 30 以上の値に設定します。Note
他のプロバイダーを使用する場合は、SQL クライアント プログラミング Homepage を確認。
SQL Server Management Studio (SSMS) を使用する場合は、 [サーバーに接続] ダイアログ ボックスで [Connection プロパティ タブを選択し、Connection のタイムアウト設定を大きい値に設定します。
最終的に接続が成功した場合は、ネットワークの問題になります。 この問題を解決するには、ネットワーク管理者と協力する必要があります。 解決したら、アプリケーションの既定の設定に戻すことができます。
Note
アプリケーションで接続タイムアウトを増やすことは可能な方法ですが、長期的な解決策ではありません。 これは、データ ソースに接続しようとすると、接続が短時間 (通常は数ミリ秒以内) に行われるためです。
エラーの一般的な原因と解決策
次の表に、タイムアウト期限切れエラーの一般的な原因と解決策を示します。 その他のヒントと提案については、「 トラブルシューティング: タイムアウト期限切れ」を参照してください。
一般的な原因 | 解決策 |
---|---|
サーバー名が正しく入力されませんでした。 | 正しいサーバー名でもう一度やり直してください。 |
サーバー上の SQL Server サービスが実行されていません。 | SQL Server データベース エンジンのインスタンスを起動します。 |
データベース エンジン インスタンスの TCP/IP ポートはファイアウォールによってブロックされます。 | データベース エンジンへのアクセスを許可するようにファイアウォールを構成します。 |
データベース エンジンはポート 1433 でリッスンしていません。 これは、ポートが変更されたか、既定のインスタンスではなく、SQL Server Browser サービスが実行されていないためです。 | SQL Server Browser サービスを開始するか、 Sqlcmd -S <ip_addres>,<port> コマンドを使用して接続する TCP/IP ポート番号を指定します。 エラー ログで、SQL Server がリッスンしているポート番号を見つけます。 |
SQL Server Browser サービスは実行されていますが、UDP ポート 1434 はファイアウォールによってブロックされています。 | サーバー上の UPD ポート 1434 へのアクセスを許可するようにファイアウォールを構成するか、接続する TCP/IP ポート番号を指定します。 |
クライアントとサーバーは、同じネットワーク プロトコルを使用するように構成されていません。 | SQL Server 構成マネージャーを使用して、サーバーコンピューターとクライアント コンピューターに共通のプロトコルが少なくとも 1 つ有効になっていることを確認します。 たとえば、クライアントが TCP/IP ソケットを使用して接続しているが、SQL Server が名前付きパイプのみをリッスンしている場合、接続を確立することはできません。 |
ネットワークはサーバー名を IP アドレスに解決できません。ping または telnet プログラムを使用してテストできます。 | ネットワーク上のコンピューター名解決の問題を修正するか、IP アドレスを使用してサーバーに接続します。これは SQL Server の問題ではありません。 サポートについては、Windows のドキュメントを参照するか、ネットワーク管理者にお問い合わせください。 接続をテストするには、次のコマンドを使用します。telnet <ServerName> [<Port>] telnet <IP_Address> <Port> IP アドレスを使用してもサーバー名が機能しない場合は、名前解決の問題になります。 |
ネットワークは IP アドレスを使用して接続できません。これは、ping、telnet、または tracert プログラムを使用してテストできます。 | ネットワーク上の TCP/IP の問題を解決します。これは SQL Server の問題ではありません。 サポートについては、Windows のドキュメントを参照するか、ネットワーク管理者にお問い合わせください。 ネットワークのより高度なトラブルシューティングについては、「 0300 断続的または定期的なネットワークの問題を参照してください。 |