Compartilhar via


Mensagens de tempo limite expirado ao se conectar ao SQL Server

Aplica-se a: SQL Server

Observação

Antes de iniciar a solução de problemas, verifique os pré-requisitos e percorra 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" que você recebe ao se conectar ao SQL Server.

Verificar erros de tempo limite expirado

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

  • O tempo limite expirou. O tempo limite acabou 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 tempo limite expirou ao tentar consumir a confirmação de handshake de pré-logon. Isso pode ocorrer porque o handshake de pré-logon falhou ou o servidor não pôde responder a tempo. A duração da tentativa de conexão com este servidor foi [Pre-Login] initialization=23; handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005): a operação de espera atingiu o tempo limite.

  • System.Data.SqlClient.SqlException (0x80131904): Tempo limite expirado. O tempo limite acabou antes da conclusão da operação ou o servidor não está respondendo. System.ComponentModel.Win32Exception (0x80004005): a operação de espera atingiu o tempo limite.

  • O tempo limite da conexão expirou. O tempo limite expirou ao tentar consumir a confirmação de handshake de pré-logon. Isso pode ocorrer porque o handshake de pré-logon falhou ou o servidor não pôde responder a tempo.
    A duração gasta ao tentar se conectar a este servidor foi [Pré-login] inicialização = 21036; aperto de mão = 0; (Microsoft SQL Server, Erro: -2).

  • System.InvalidOperationException: Tempo limite expirado. O período de tempo limite foi atingido 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ê pode evitar esses erros se seguir as etapas descritas no artigo esgotado do pool de conexões.

Observação

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

Determinar o tipo de erros de tempo limite expirado

Do ponto de vista da conectividade, você encontra os seguintes problemas de tempo limite:

  • Tempo limite de 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 caracteres 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.

  • Veja 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 SqlCommand classe é usada para trabalhar com uma consulta, não com uma conexão. O ExecuteScalar método é 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 connection-timeout.

      • 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 será bem-sucedida. Por exemplo, se você usar System.Data.SqlClient, defina a propriedade SqlConnection.ConnectionTimeout como 30 ou um valor superior.

        Observação

        Se você usar outros provedores, verifique a página inicial da 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 da conexão como um valor mais alto.

    2. Se a conexão for bem-sucedida, é um problema de rede. Você precisa trabalhar com o administrador da 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 ocorre 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 expirado. 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 da instância do Mecanismo de Banco de Dados está 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 Navegador do SQL Server não está em execução. Inicie o serviço Navegador do SQL Server ou especifique um número de porta TCP/IP para se conectar ao Sqlcmd -S <ip_addres>,<port> comando. No log de erros, localize o número da porta que o SQL Server está escutando.
O serviç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 servidor e cliente 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 nomes do computador em sua rede ou conecte-se ao servidor usando o endereço IP — 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 da rede. Use o seguinte comando para testar a conectividade:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Se o uso de um endereço IP funcionar, mas o nome do servidor não funcionar, é 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 da rede.
Para obter uma solução de problemas de rede mais avançada, consulte 0300 Problema de rede intermitente ou periódico.

Confira também