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

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

Сводка

Ошибка "Истекло время ожидания" в 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). Время операции ожидания истекло.

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

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

    Если подключения закрыты неправильно, могут возникать ошибки. Эти ошибки возникают из-за того, что все подключения в пуле используются, и достигается максимальный размер пула. Эти ошибки можно избежать, если вы выполните действия, описанные в статье об исчерпании пула подключений. Дополнительные сведения о работе пула см. в разделе SQL Server пул подключений (ADO.NET).

Примечание.

Вторая и третья ошибки возникают при установке .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.

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

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

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

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

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

      Примечание.

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

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

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

    Примечание.

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

Причины ошибок времени ожидания подключения, портов и протоколов

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

Типичные причины Разрешения
Служба SQL Server на сервере не запущена. Запустите экземпляр ядро СУБД SQL Server.
Порт TCP/IP для экземпляра ядро СУБД блокируется брандмауэром. Настройте брандмауэр, чтобы разрешить доступ к ядро СУБД.
Ядро СУБД не прослушивается через порт 1433. Это связано с тем, что порт изменен или не является экземпляром по умолчанию, а служба браузера SQL Server не запущена. Запустите службу браузера SQL Server или укажите номер порта TCP/IP для подключения к команде Sqlcmd -S <ip_addres>,<port> . В журнале ошибок найдите номер порта, на который прослушивается SQL Server. Дополнительные сведения см. в статье "Настройка сервера для прослушивания определенного TCP-порта".
Служба браузера SQL Server запущена, но порт UDP 1434 блокируется брандмауэром. Настройте брандмауэр, чтобы разрешить доступ к порту UPD 1434 на сервере или указать номер порта TCP/IP для подключения.
Клиент и сервер не настроены для использования одного сетевого протокола. Убедитесь, что сервер и клиентские компьютеры имеют по крайней мере один протокол с включенным протоколом, используя диспетчер конфигурации SQL Server. Например, если клиент подключается с помощью сокетов 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 Периодические или периодические проблемы с сетью.