SQL Serverに接続するときの接続タイムアウト エラーのトラブルシューティング

適用対象: SQL Server

まとめ

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 から接続を取得するまでに経過したタイムアウト時間。

    接続が正しく閉じられていない場合は、エラーが発生する可能性があります。 これらのエラーは、プールされたすべての接続が使用中であり、最大プール サイズに達したために発生します。 接続プールの に関する記事で説明されている手順に従うと これらのエラーを回避できます。 プールのしくみの詳細については、「SQL Server接続プール (ADO.NET)」を参照してください。

Note

2 番目と 3 番目のエラーは、.NET Framework 4.5 以降のバージョンがインストールされている場合に発生します。

発生したタイムアウトの種類を確認する

データベース アプリケーションでよく見られるタイムアウトの問題には、次の 2 種類があります。

  • 接続タイムアウト (既定では 15 秒)
  • クエリまたはコマンドのタイムアウト (既定では 30 秒)

これら 2 つの問題は、異なるソースから発生し、データベース アプリケーションの対話の独立したフェーズで発生するため、本質的に大きく異なります。 データベース エンジンへの最初の接続が失敗すると、接続タイムアウトが発生します。 一方、クエリまたはコマンドのタイムアウトは、アプリケーションとデータベース サーバーとの対話の有効期間のずっと後に発生します。 最初の接続は正常に完了しましたが、データベース サーバーに送信したクエリの完了に時間がかかります。

トラブルシューティングを行う前に、エラー メッセージの完全な呼び出し履歴を表示して、エラーの種類を特定します。

  • 接続タイムアウトの呼び出し履歴の次の例を参照してください。

    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 メソッドは、クエリの実行に使用されます。 ExecuteReaderExecuteNonQueryなど、他の項目も表示できます。

    クエリまたはコマンドのタイムアウト エラーが発生した場合は、「 クエリタイムアウトエラーのトラブルシューティング」を参照してください。

SQL Serverでの接続タイムアウト エラーのトラブルシューティング

接続タイムアウト エラーが発生した場合は、次の手順に従います。

  1. 接続タイムアウト パラメーターを増やします。

    • アプリケーションを使用して SQL Server に接続する場合は、関連する接続タイムアウト パラメーター値を増やし、最終的に接続が成功するかどうかを確認します。 たとえば、 System.Data.SqlClientを使用する場合は、 SqlConnection.ConnectionTimeout プロパティを 30 以上の値に設定します。 現在のMicrosoftを使用する場合。Data.SqlClient ドライバーで、同等の SqlConnection.ConnectionTimeout プロパティを設定します。

      Note

      他のプロバイダーを使用する場合は、SQL クライアント プログラミング Homepage を確認

    • SQL Server Management Studio (SSMS) を使用する場合は、 [サーバーに接続] ダイアログ ボックスで [Connection プロパティ タブを選択し、Connection のタイムアウト設定を大きい値に設定します。

  2. 最終的に接続が成功した場合は、ネットワークの問題になります。 ネットワーク管理者と協力して問題を解決してください。 解決したら、アプリケーションの既定の設定に戻すことができます。

    Note

    アプリケーションで接続タイムアウトを増やすことは可能な方法ですが、長期的な解決策ではありません。 これは、データ ソースに接続しようとすると、接続が短時間 (通常は数ミリ秒以内) に行われるためです。

接続タイムアウト エラーのサービス、ポート、プロトコルの原因

次の表SQL Server、サービス、ポート、およびネットワーク プロトコルのタイムアウト期限切れエラーの原因と、それぞれを解決する方法を示します。 その他のヒントと提案については、「 トラブルシューティング: タイムアウト期限切れ」を参照してください。

一般的な原因 解決策
サーバー上の SQL Server サービスが実行されていません。 SQL Server データベース エンジンのインスタンスを起動します。
データベース エンジン インスタンスの TCP/IP ポートはファイアウォールによってブロックされます。 データベース エンジンへのアクセスを許可するようにファイアウォールを構成します。
データベース エンジンはポート 1433 でリッスンしていません。 これは、ポートが変更されたか、既定のインスタンスではなく、SQL Server Browser サービスが実行されていないためです。 SQL Server Browser サービスを開始するか、 Sqlcmd -S <ip_addres>,<port> コマンドを使用して接続する TCP/IP ポート番号を指定します。 エラー ログで、SQL Server がリッスンしているポート番号を見つけます。 詳細については、「 特定の TCP ポートでリッスンするようにサーバーを構成する」を参照してください。
SQL Server Browser サービスは実行されていますが、UDP ポート 1434 はファイアウォールによってブロックされています。 サーバー上の UPD ポート 1434 へのアクセスを許可するようにファイアウォールを構成するか、接続する TCP/IP ポート番号を指定します。
クライアントとサーバーは、同じネットワーク プロトコルを使用するように構成されていません。 SQL Server 構成マネージャーを使用して、サーバーコンピューターとクライアント コンピューターに共通のプロトコルが少なくとも 1 つ有効になっていることを確認します。 たとえば、クライアントが TCP/IP ソケットを使用して接続しているが、SQL Server が名前付きパイプのみをリッスンしている場合、接続を確立することはできません。

ネットワークと名前解決によって接続タイムアウト エラーが発生する

次の表に、DNS 名前解決エラーや TCP/IP ルーティングの問題など、タイムアウトの期限切れエラーのネットワーク レベルの原因と、それぞれを解決する方法を示します。

一般的な原因 解決策
サーバー名が正しく入力されませんでした。 正しいサーバー名でもう一度やり直してください。
ネットワークは、サーバー名を 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 断続的または定期的なネットワークの問題を参照してください。