SQL Server への接続時に「タイムアウト期間が経過しました」メッセージが表示される

適用対象: SQL Server

注:

トラブルシューティングを開始する前に、前提条件を確認し、チェックリストを確認してください。

タイムアウト エラーは、特定の操作に必要以上の時間がかかっていることを意味します。 クライアント アプリケーションは (無期限に待機するのではなく) 操作を停止します。これにより、他の操作がブロックされ、アプリケーションが中断される可能性があります。 この記事では、SQL Server への接続時に発生する「コマンド タイムアウト」エラーと「接続タイムアウト」エラーの解決策について説明します。

「タイムアウト期間が経過しました」エラーを確認する

「タイムアウト期間が経過しました」の問題が発生すると、次のエラー メッセージの 1 つ以上が表示されます。

  • タイムアウト期間が経過しました。 The timeout period elapsed prior to completion of the operation or the server is not responding.

  • System.Data.SqlClient.SqlException (0x80131904): 接続がタイムアウトしました。 ログイン前のハンドシェイクの確認を実行しようとしている間にタイムアウト期間が過ぎました。 ログイン前のハンドシェイクに失敗したか、サーバーが時間内に応答できなかった可能性があります。 このサーバーへの接続の試行に費やされた時間 - [ログイン前] 初期化 =23; ハンドシェイク =14979;
    System.ComponentModel.Win32Exception (0x80004005): 待ち操作がタイムアウトになりました。

  • System.Data.SqlClient.SqlException (0x80131904): タイムアウト期間が経過しました。 The timeout period elapsed prior to completion of the operation or the server is not responding. System.ComponentModel.Win32Exception (0x80004005): 待ち操作がタイムアウトになりました。

  • 接続がタイムアウトしました。 ログイン前のハンドシェイクの確認を実行しようとしている間にタイムアウト期間が過ぎました。 ログイン前のハンドシェイクに失敗したか、サーバーが時間内に応答できなかった可能性があります。
    このサーバーへの接続の試行に費やされた時間 - [ログイン前] 初期化 =21036}; ハンドシェイク =0; (Microsoft SQL Server、エラー: -2)。

  • System.InvalidOperationException: タイムアウト期間が経過しました。 プールから接続を取得する前にタイムアウト期間が過ぎました。

    接続が正しく閉じられていないと、エラーが発生する可能性があります。 これらのエラーは、プールされたすべての接続が使用中であり、最大プール サイズに達したために発生します。 「接続プールの減少」の記事で説明されている手順に従うと、これらのエラーを回避できます。

注:

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

「タイムアウト期間が経過しました」エラーの種類を確認する

接続の観点から、次のタイムアウトの問題が発生します。

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

注:

デフォルト値は、コード、接続文字列、またはその他のメソッドで設定できます。

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

  • 接続タイムアウトのコール スタックの次の例を参照してください。

    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 など、他の項目も表示できます。

「タイムアウト期間が経過しました」エラーのトラブルシューティング

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

  • 接続タイムアウト エラーが発生した場合は、次の手順を実行します。

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

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

        注:

        他のプロバイダーを使用する場合は、「SQL クライアント プログラミングのホームページ」を確認してください。

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

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

      注:

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

エラーの一般的な原因と解決策

次の表に、「タイムアウト期間が経過しました」エラーの一般的な原因と解決策を示します。 その他のヒントと推奨事項については、「トラブルシューティング: タイムアウト期間が経過しました」を参照してください。

一般的な原因 解決策
サーバー名が正しく入力されませんでした。 正しいサーバー名でもう一度やり直してください。
サーバー上の SQL Server サービスが実行されていません。 SQL Server データベース エンジンのインスタンスを開始します。
データベース エンジン インスタンスの TCP/IP ポートがファイアウォールによってブロックされています。 データベース エンジンへのアクセスを許可するようにファイアウォールを構成します。
データベース エンジンがポート 1433 でリッスンしていません。 これは、ポートが変更されているか、ポートが既定のインスタンスではなく、SQL Server Browser サービスが実行されていないためです。 SQL Server Browser サービスを開始するか、TCP/IP ポート番号を指定して Sqlcmd -S <ip_addres>,<port> コマンドで接続します。 エラー ログで、SQL Server がリッスンしているポート番号を見つけます。
SQL Server Browser サービスは実行されていますが、UDP ポート 1434 がファイアウォールによってブロックされています。 サーバーの UDP ポート 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 Intermittent or Periodic Network Issue」を参照してください。

関連項目