Solución de errores de tiempo de espera de conexión al conectarse a SQL Server

Se aplica a: SQL Server

Resumen

Un error "Tiempo de espera expirado" en SQL Server significa que una operación de conexión o comando no se completó dentro del intervalo de tiempo de espera que permite la aplicación cliente, por lo que el cliente canceló la operación en lugar de esperar indefinidamente. Este artículo le ayuda a identificar si se alcanza un tiempo de espera de conexión o un tiempo de espera de consulta o comando. Trata los mensajes de error que puede encontrar con un tiempo de espera de conexión y el servicio típico, el puerto, el firewall y la resolución de nombres provocan tiempos de espera de conexión. Use este artículo cuando una aplicación cliente no se conecte de forma intermitente o coherente a una instancia de SQL Server con errores de tiempo de espera de conexión.

Para solucionar problemas de errores de tiempo de espera de consulta o comando, consulte Solución de errores de tiempo de espera de consulta.

Nota:

Antes de empezar a solucionar problemas, compruebe los requisitos previos y siga la lista de comprobación.

Mensajes de error expirados de tiempo de espera al conectarse a SQL Server

Cuando encuentre problemas de "tiempo de espera expirado", recibirá uno o varios de los siguientes mensajes de error:

  • Tiempo de espera agotado. El tiempo de espera transcurrió antes de que se completase la operación, o bien el servidor no responde.

  • System.Data.SqlClient.SqlException (0x80131904): tiempo de espera de conexión expirado. El período de tiempo de espera transcurrió al intentar consumir la confirmación del protocolo de enlace previo al inicio de sesión. Esto podría deberse a un error en el protocolo de enlace previo al inicio de sesión o a que el servidor no pudo responder a tiempo. El tiempo invertido al intentar conectarse a este servidor fue: [Previo al inicio de sesión] inicialización=23; protocolo de enlace=14979;
    System.ComponentModel.Win32Exception (0x80004005): se agotó el tiempo de espera de la operación wait.

  • System.Data.SqlClient.SqlException (0x80131904): tiempo de espera expirado. El tiempo de espera transcurrió antes de que se completase la operación, o bien el servidor no responde. System.ComponentModel.Win32Exception (0x80004005): se agotó el tiempo de espera de la operación wait.

  • Tiempo de espera de conexión agotado. El período de tiempo de espera transcurrió al intentar consumir la confirmación del protocolo de enlace previo al inicio de sesión. Esto podría deberse a un error en el protocolo de enlace previo al inicio de sesión o a que el servidor no pudo responder a tiempo.
    La duración gastada al intentar conectarse a este servidor era [Inicio de sesión previo] inicialización=21036; handshake=0; (Microsoft SQL Server, Error: -2).

  • System.InvalidOperationException: tiempo de espera expirado. Tiempo de espera transcurrido antes de obtener una conexión del grupo.

    Si las conexiones no se cierran correctamente, pueden producirse errores. Estos errores se producen porque se usan todas las conexiones agrupadas y se alcanza el tamaño máximo del grupo. Puede evitar estos errores si sigue los pasos descritos en el artículo sobre el grupo de conexiones agotado. Para obtener más información sobre cómo funciona la agrupación, consulte SQL Server agrupación de conexiones (ADO.NET) .

Nota:

El segundo y el tercer error se producen cuando se instala .NET Framework 4.5 o una versión posterior.

Determinar qué tipo de tiempo de espera se ha producido

Hay dos tipos de problemas de tiempo de espera observados habitualmente con las aplicaciones de base de datos:

  • Tiempo de espera de conexión (15 segundos de forma predeterminada)
  • Tiempo de espera de consulta o comando (30 segundos de forma predeterminada)

Estos dos problemas son muy diferentes en la naturaleza, ya que proceden de orígenes diferentes y se producen en fases independientes independientes de una interacción de la aplicación de base de datos. Se produce un tiempo de espera de conexión cuando se produce un error en una conexión inicial con el motor de base de datos. Por otro lado, un tiempo de espera de consulta o comando se produce mucho más adelante en la vida de una interacción de la aplicación con un servidor de bases de datos. La conexión inicial se ha realizado correctamente, pero una consulta que envió al servidor de bases de datos tarda mucho tiempo en completarse.

Antes de solucionar problemas, vea la pila de llamadas completa de los mensajes de error para determinar el tipo de error.

  • Consulte el ejemplo siguiente de una pila de llamadas de un tiempo de espera de conexión:

    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 el cliente está intentando abrir una conexión y, por tanto, no está relacionado con una consulta.

  • Consulte el ejemplo siguiente de una pila de llamadas de un tiempo de espera de consulta o 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()
    

    La SqlCommand clase se usa para trabajar con una consulta, no con una conexión. El ExecuteScalar método se usa para ejecutar una consulta. También puede ver otros elementos, como o ExecuteReaderExecuteNonQuery.

    Si encuentra un error de tiempo de espera de consulta o comando, consulte Solución de errores de tiempo de espera de consulta.

Solución de errores de tiempo de espera de conexión en SQL Server

Si se produce un error de tiempo de espera de conexión, siga estos pasos:

  1. Aumente el parámetro de tiempo de espera de conexión.

    • Si usa una aplicación para conectarse a SQL Server, aumente los valores de parámetros de tiempo de espera de conexión pertinentes y compruebe si la conexión finalmente se realiza correctamente. Por ejemplo, si usa System.Data.SqlClient, establezca la propiedad SqlConnection.ConnectionTimeout en 30 o un valor superior. Si usa el Microsoft actual. Controlador Data.SqlClient, establezca la propiedad SqlConnection.ConnectionTimeout equivalente.

      Nota:

      Si usa otros proveedores, consulte Página principal para la programación del cliente SQL.

    • Si usa SQL Server Management Studio (SSMS), seleccione la pestaña Propiedades de conexión en el cuadro de diálogo Conectar al servidor y establezca Tiempo de espera de conexión en un valor superior.

  2. Si la conexión se realiza correctamente, se trata de un problema de red. Trabaje con el administrador de red para resolver el problema. Una vez resuelto, puede revertir a la configuración predeterminada en la aplicación.

    Nota:

    Aumentar el tiempo de espera de conexión en la aplicación es un método posible, pero no es una resolución a largo plazo. Esto se debe a que la conexión se produce rápidamente (normalmente en unos pocos milisegundos) cuando intenta conectarse a un origen de datos.

Causas de errores de tiempo de espera de conexión, puerto y protocolo

En la tabla siguiente se enumeran las causas de errores expirados de tiempo de espera SQL Server servicio, puerto y protocolo de red, y cómo resolver cada uno de ellos. Para obtener más sugerencias y sugerencias, consulte Solución de problemas: Tiempo de espera expirado.

Causas típicas Resoluciones
El servicio SQL Server en el servidor no se está ejecutando. Inicie la instancia del Motor de base de datos de SQL Server.
Un firewall bloquea el puerto TCP/IP de la instancia de Motor de base de datos. Configure el firewall para permitir el acceso a la Motor de base de datos.
El Motor de base de datos no escucha en el puerto 1433. Esto se debe a que se cambia el puerto o no es la instancia predeterminada y el servicio SQL Server Browser no se está ejecutando. Inicie el servicio SQL Server Browser o especifique un número de puerto TCP/IP para conectarse con el Sqlcmd -S <ip_addres>,<port> comando . En el registro de errores, busque el número de puerto en el que ESTÁ escuchando SQL Server. Para obtener más información, consulte Configuración de un servidor para escuchar en un puerto TCP específico.
El servicio SQL Server Browser se está ejecutando, pero un firewall bloquea el puerto UDP 1434. Configure el firewall para permitir el acceso al puerto UPD 1434 en el servidor o especifique el número de puerto TCP/IP que se va a conectar.
El cliente y el servidor no están configurados para usar el mismo protocolo de red. Asegúrese de que los equipos cliente y servidor tengan al menos un protocolo habilitado en común mediante Administrador de configuración de SQL Server. Por ejemplo, si el cliente se conecta mediante sockets TCP/IP, pero SQL Server solo escucha en canalizaciones con nombre, no se puede establecer ninguna conectividad.

Causas de errores de tiempo de espera de conexión y resolución de nombres

En la tabla siguiente se enumeran las causas de los errores expirados de tiempo de espera de tiempo de espera, como errores de resolución de nombres DNS y problemas de enrutamiento TCP/IP, y cómo resolver cada uno.

Causas típicas Resoluciones
El nombre del servidor se ha escrito incorrectamente. Inténtelo de nuevo con el nombre de servidor correcto.
La red no puede resolver el nombre del servidor en una dirección IP. Pruebe este problema mediante el uso de los programas de ping o telnet. Corrija el problema de resolución de nombres de equipo en la red o conéctese al servidor mediante la dirección IP. Este problema no es un problema SQL Server. Para obtener ayuda, consulte la documentación de Windows o póngase en contacto con el administrador de red. Use el siguiente comando para probar la conectividad:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Si el uso de una dirección IP funciona, pero el nombre del servidor no funciona, se trata de un problema de resolución de nombres.
La red no se puede conectar mediante la dirección IP. Pruebe este problema mediante el programa ping, telnet o tracert . Corrija el problema de TCP/IP en la red. Este problema no es un problema SQL Server. Para obtener ayuda, consulte la documentación de Windows o póngase en contacto con el administrador de red.
Para obtener una solución de problemas de red más avanzada, consulte 0300 Problemas de red intermitentes o periódicos.