Сообшения "Истекло время ожидания" при подключении к SQL Server

Применяется к: SQL Server

Примечание.

Прежде чем приступить к устранению неполадок, рекомендуется проверить предварительные требования и ознакомиться с контрольным списком.

Ошибка времени ожидания означает, что определенная операция занимает больше времени, чем требуется. Клиентское приложение останавливает операцию (вместо бесконечного ожидания), что может блокировать другие операции и приостанавливать приложение. В этой статье приведены способы устранения ошибок "время ожидания команд" и "время ожидания подключения", которые вы получаете при подключении к SQL Server.

Проверка ошибок истечения времени ожидания

При возникновении проблемы, связанной с истечением времени ожидания, появляется одно или несколько сообщений об ошибке:

  • Истекло время ожидания. Срок ожидания истек до завершения операции, или сервер не отвечает.

  • System.Data.SqlClient.SqlException (0x80131904): истекло время ожидания подключения. Время ожидания истекло при попытке обработки подтверждения предварительного согласования. Возможно, произошел сбой во время предварительного согласования, или сервер не смог ответить вовремя. Время, затраченное на попытки подключиться к этому серверу, составило: [Pre-Login] initialization=23; handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005): Время ожидания операции истекло.

  • System.Data.SqlClient.SqlException (0x80131904): истекло время ожидания. Срок ожидания истек до завершения операции, или сервер не отвечает. System.ComponentModel.Win32Exception (0x80004005): Время ожидания операции истекло.

  • Истекло время ожидания соединения. Время ожидания истекло при попытке обработки подтверждения предварительного согласования. Возможно, произошел сбой во время предварительного согласования, или сервер не смог ответить вовремя.
    Время, затраченное на попытку подключения к этому серверу, было [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Error: -2).

  • Истекло время ожидания входа Время ожидания истекло до получения подключения из пула.

    Если подключения закрыты неправильно, могут возникнуть ошибки. Эти ошибки возникают из-за того, что используются все подключения в пуле и достигнут максимальный размер пула. Эти ошибки можно избежать, если вы выполните действия, описанные в статье Исчерпание пула подключений .

Примечание.

Вторая и третья ошибка возникают, если установлена платформа .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 используется для выполнения запроса. Вы также можете увидеть другие элементы, такие как ExecuteReader или ExecuteNonQuery.

Устранение ошибок, связанных с истечением времени ожидания

  • Если возникает ошибка запроса или времени ожидания команды, см. раздел Устранение ошибок времени ожидания запроса.

  • При возникновении ошибки времени ожидания подключения выполните следующие действия.

    1. Увеличьте параметр времени ожидания подключения.

      • Если используется приложение для подключения к SQL Server, увеличьте соответствующие значения параметров времени ожидания подключения и убедитесь, что подключение в конечном итоге успешно установлено. Например, при использовании System.Data.SqlClient задайте для свойства SqlConnection.ConnectionTimeout значение 30 или более высокое.

        Примечание.

        Если вы используете других поставщиков, проверьте Домашнюю страницу для программирования клиентов SQL.

      • Если вы используете SQL Server Management Studio (SSMS), выберите вкладку Свойства подключения в диалоговом окне Подключение к серверу и задайте для Параметра времени ожидания подключения более высокое значение.

    2. Если подключение в конечном итоге завершится успешно, то проблема вызвана сетью. Чтобы устранить эту проблему, обратитесь к администратору сети. После устранения проблемы можно вернуться к параметрам по умолчанию в приложении.

      Примечание.

      Увеличение времени ожидания подключения в приложении является возможным методом, но не является долгосрочным решением. Это связано с тем, что при попытке подключения к источнику данных подключение происходит быстро (обычно в течение нескольких миллисекунд).

Типичные причины и способы устранения ошибки

В следующей таблице перечислены типичные причины и способы устранения ошибок "Истекло время ожидания". Дополнительные советы и предложения см. в разделе Устранение неполадок: истекло время ожидания.

Типичные причины Решения
Неправильно введено имя сервера. Повторите попытку с правильным именем сервера.
Служба SQL Server на сервере не запущена. Запустите экземпляр компонента SQL Server Database Engine.
Порт TCP/IP для экземпляра ядра СУБД блокируется брандмауэром. Настройте брандмауэр для разрешения доступа к ядру СУБД.
Ядро СУБД не прослушивает порт 1433. Это связано с тем, что порт изменен или не является экземпляром по умолчанию и служба SQL Server браузера не запущена. Запустите службу SQL Server браузера или укажите номер порта TCP/IP для подключения с помощью команды Sqlcmd -S <ip_addres>,<port>. В журнале ошибок найдите номер порта, который SQL Server прослушивает.
Служба SQL Server браузера запущена, но UDP-порт 1434 заблокирован брандмауэром. Настройте брандмауэр, чтобы разрешить доступ к upD-порту 1434 на сервере, или укажите номер порта TCP/IP для подключения.
Клиент и сервер не настроены для использования одного сетевого протокола. Убедитесь, что сервер и клиентские компьютеры имеют по крайней мере один включенный протокол, используя диспетчер конфигурации SQL Server. Например, если клиент подключается с помощью сокетов TCP/IP, но SQL Server прослушивает только именованные каналы, установить подключение невозможно.
Сеть не может разрешить имя сервера в IP-адрес. Это можно проверить с помощью программ проверки связи или telnet. Устраните проблему с разрешением имен компьютера в сети или подключение к серверу с помощью IP-адреса. Это не проблемы SQL Server. За помощью обратитесь к документации Windows или обратитесь к администратору сети. Для проверки подключения используйте следующую команду:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Если использование IP-адреса работает, но имя сервера не работает, то проблема связана с разрешением имен.
Сеть не может подключиться по IP-адресу. Это можно проверить с помощью программы проверки связи, telnet или tracert . Устранена проблема TCP/IP в сети. Это не связано с проблемой SQL Server. За помощью обратитесь к документации Windows или обратитесь к администратору сети.
Дополнительные сведения об устранении неполадок в сети см. в разделе 0300 Временно или периодически возникающие проблемы с сетью.

См. также