Tempo limite de mensagens expiradas ao se conectar ao SQL Server

Aplica-se ao: SQL Server

Observação

Antes de começar a solucionar problemas, verifique os pré-requisitos e acesse a lista de verificação.

Um erro de tempo limite significa que uma determinada operação leva mais tempo do que o necessário. O aplicativo cliente interrompe a operação (em vez de aguardar indefinidamente), o que pode bloquear outras operações e suspender um aplicativo. Este artigo fornece resoluções para erros de "tempo limite de comando" e "tempo limite de conexão" recebidos ao se conectar ao SQL Server.

Verificar erros de tempo limite expirado

Quando você encontra problemas de "tempo limite expirado", uma ou mais das seguintes mensagens de erro é exibida:

  • O tempo limite expirou. O período de tempo limite decorreu antes da conclusão da operação ou o servidor não está respondendo.

  • System.Data.SqlClient.SqlException (0x80131904): Tempo Limite de Conexão Expirado. O período de tempo limite decorrido ao tentar consumir a confirmação de handshake de pré-logon. Isso pode ser porque o handshake de pré-logon falhou ou o servidor não pôde responder no tempo. A duração da tentativa de conexão com esse servidor foi [Pre-Login] initialization=23; handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005): o tempo limite de espera foi atingido.

  • System.Data.SqlClient.SqlException (0x80131904): o tempo limite expirou. O período de tempo limite decorreu antes da conclusão da operação ou o servidor não está respondendo. System.ComponentModel.Win32Exception (0x80004005): o tempo limite de espera foi atingido.

  • Tempo Limite de Conexão Expirado. O período de tempo limite decorrido ao tentar consumir a confirmação de handshake de pré-logon. Isso pode ser porque o handshake de pré-logon falhou ou o servidor não pôde responder no tempo.
    A duração da tentativa de conexão com este servidor foi [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Erro: -2).

  • System.InvalidOperationException: o tempo limite expirou. O período de tempo limite decorrido antes de obter uma conexão do pool.

    Se as conexões não forem fechadas corretamente, poderão ocorrer erros. Esses erros ocorrem porque todas as conexões em pool estão em uso e o tamanho máximo do pool é atingido. Você poderá evitar esses erros se seguir as etapas descritas no artigo pool de conexões esgotado.

Observação

O segundo e o terceiro erro ocorrem quando .NET Framework 4.5 ou uma versão posterior é instalada.

Determinar o tipo de erros de tempo limite expirado

De uma perspectiva de conectividade, você encontra os seguintes problemas de tempo limite:

  • Tempo limite da conexão (15 segundos por padrão)
  • Tempo limite de consulta ou comando (30 segundos por padrão)

Observação

Os valores padrão podem ser definidos por meio de código, cadeia de conexão ou outros métodos.

Antes de solucionar problemas, exiba a pilha de chamadas completa das mensagens de erro para determinar o tipo de erro.

  • Veja o exemplo a seguir de uma pilha de chamadas de um tempo limite de conexão:

    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 indica que o cliente está tentando abrir uma conexão e, portanto, não está relacionado a uma consulta.

  • Consulte o exemplo a seguir de uma pilha de chamadas de um tempo limite de consulta ou comando:

    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()
    

    A classe SqlCommand é usada para trabalhar com uma consulta, não com uma conexão. O método ExecuteScalar é usado para executar uma consulta. Você também pode ver outros itens, como um ExecuteReader ou ExecuteNonQuery.

Solucionar problemas de erros de tempo limite expirado

  • Se você encontrar um erro de tempo limite de consulta ou comando, consulte Solucionar problemas de erros de tempo limite de consulta.

  • Se você encontrar um erro de tempo limite de conexão, siga as etapas:

    1. Aumente o parâmetro de tempo limite de conexão.

      • Se você usar um aplicativo para se conectar ao SQL Server, aumente os valores de parâmetro de tempo limite de conexão relevantes e verifique se a conexão eventualmente é bem-sucedida. Por exemplo, se você usar System.Data.SqlClient, defina a propriedade SqlConnection.ConnectionTimeout como 30 ou um valor mais alto.

        Observação

        Se você usar outros provedores, verifique a Home Page para programação do cliente SQL.

      • Se você usar o SSMS (SQL Server Management Studio), selecione a guia Propriedades da Conexão na caixa de diálogo Conectar ao Servidor e defina a Configuração de tempo limite de conexão como um valor mais alto.

    2. Caso a conexão seja bem-sucedida, trata-se de um problema de rede. Você precisa trabalhar com o administrador de rede para resolver o problema. Depois que ele for resolvido, você poderá reverter para as configurações padrão em seu aplicativo.

      Observação

      Aumentar o tempo limite de conexão no aplicativo é um método possível, mas não é uma resolução de longo prazo. Isso acontece porque a conexão ocorre rapidamente (geralmente em alguns milissegundos) quando você tenta se conectar a uma fonte de dados.

Causas e resoluções típicas para o erro

A tabela a seguir lista as causas e resoluções típicas para erros de tempo limite expirados. Para obter mais dicas e sugestões, consulte Solução de problemas: tempo limite expirado.

Causas típicas Resoluções
O nome do servidor foi digitado incorretamente. Tente novamente com o nome do servidor correto.
O serviço SQL Server no servidor não está em execução. Inicie a instância do Mecanismo de Banco de Dados do SQL Server.
A porta TCP/IP para a instância do Mecanismo de Banco de Dados é bloqueada por um firewall. Configure o firewall para permitir o acesso ao Mecanismo de Banco de Dados.
O Mecanismo de Banco de Dados não está escutando na porta 1433. Isso ocorre porque a porta foi alterada ou não é a instância padrão e o serviço do Navegador do SQL Server não está em execução. Inicie o serviço do Navegador do SQL Server ou especifique um número da porta TCP/IP para se conectar ao comando Sqlcmd -S <ip_addres>,<port>. No log de erros, localize o número da porta que o SQL Server está escutando.
O Navegador do SQL Server está em execução, mas a porta UDP 1434 está bloqueada por um firewall. Configure o firewall para permitir o acesso à porta UPD 1434 no servidor ou especifique o número da porta TCP/IP a ser conectada.
O cliente e o servidor não estão configurados para usar o mesmo protocolo de rede. Verifique se os computadores cliente e servidor têm pelo menos um protocolo habilitado em comum usando o SQL Server Configuration Manager. Por exemplo, se o cliente estiver se conectando usando soquetes TCP/IP, mas o SQL Server estiver escutando apenas em pipes nomeados, nenhuma conectividade poderá ser estabelecida.
A rede não pode resolver o nome do servidor para um endereço IP. Isso pode ser testado usando os programas ping ou telnet. Corrija o problema de resolução de nome do computador em sua rede ou conecte-se ao servidor usando o endereço IP. Isso não é um problema do SQL Server. Para obter assistência, consulte a documentação do Windows ou entre em contato com o administrador de rede. Use o seguinte comando para testar a conectividade:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Caso o uso de um endereço IP funcione, mas isso não ocorra com o nome do servidor, trata-se de um problema de resolução de nomes.
A rede não pode se conectar usando o endereço IP. Isso pode ser testado usando o programa ping, telnet ou tracert. Corrija o problema de TCP/IP em sua rede. Esse não é um problema do SQL Server. Para obter assistência, consulte a documentação do Windows ou entre em contato com o administrador de rede.
Para uma solução de problemas de rede mais avançada, consulte 0300 Problema de Rede Intermitente ou Periódico.

Confira também