Solución de problemas de errores de conexión transitorios en SQL Database e Instancia administrada de SQLTroubleshoot transient connection errors in SQL Database and SQL Managed Instance

SE APLICA A: Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics

En este artículo se describe cómo evitar, solucionar, diagnosticar y mitigar los errores de conexión y los errores transitorios que la aplicación cliente encuentra cuando interactúa con Azure SQL Database, Instancia administrada de Azure SQL y Azure Synapse Analytics.This article describes how to prevent, troubleshoot, diagnose, and mitigate connection errors and transient errors that your client application encounters when it interacts with Azure SQL Database, Azure SQL Managed Instance, and Azure Synapse Analytics. Aprenda a configurar la lógica de reintento, generar la cadena de conexión y ajustar otros valores de conexión.Learn how to configure retry logic, build the connection string, and adjust other connection settings.

Errores transitoriosTransient errors (transient faults)

Un error transitorio tiene una causa subyacente que pronto se solucionará automáticamente.A transient error, also known as a transient fault, has an underlying cause that soon resolves itself. Una causa ocasional de errores transitorios se produce cuando el sistema de Azure rápidamente desplaza recursos de hardware para equilibrar mejor la carga de varias cargas de trabajo.An occasional cause of transient errors is when the Azure system quickly shifts hardware resources to better load-balance various workloads. La mayoría de estos eventos de reconfiguración se completan en menos de 60 segundos.Most of these reconfiguration events finish in less than 60 seconds. Durante este período de tiempo de reconfiguración, es posible que tenga problemas de conexión con la base de datos de SQL Database.During this reconfiguration time span, you might have issues with connecting to your database in SQL Database. Las aplicaciones que se conectan a la base de datos deberían crearse de modo que contemplen esos errores transitorios.Applications that connect to your database should be built to expect these transient errors. Para controlarlos, implemente una lógica de reintento en el código en lugar de mostrarlas a los usuarios como errores de aplicación.To handle them, implement retry logic in their code instead of surfacing them to users as application errors.

Si su programa cliente utiliza ADO.NET, se notifican al programa los errores transitorios a través del inicio de una excepción SqlException.If your client program uses ADO.NET, your program is told about the transient error by the throw of SqlException.

Conexión frente a comandosConnection vs. command

Vuelva a intentar la conexión de SQL Database e Instancia administrada de SQL o establézcala de nuevo, dependiendo de lo siguiente:Retry the SQL Database and SQL Managed Instance connection or establish it again, depending on the following:

  • Se produce un error transitorio durante un intento de conexiónA transient error occurs during a connection try

Después de un retraso de varios segundos, vuelva a intentar la conexión.After a delay of several seconds, retry the connection.

  • Se produce un error transitorio durante un comando de consulta de SQL Database Instancia administrada de SQLA transient error occurs during a SQL Database and SQL Managed Instance query command

No vuelva a intentarlo inmediatamente.Do not immediately retry the command. Por el contrario, después de un retraso, establezca de nuevo la conexión.Instead, after a delay, freshly establish the connection. A continuación, vuelva a intentar el comando.Then retry the command.

Lógica de reintento para errores transitorios.Retry logic for transient errors

Los programas cliente que encuentran ocasionalmente un error transitorio son más sólidos cuando contienen lógica de reintento.Client programs that occasionally encounter a transient error are more robust when they contain retry logic. Si el programa se comunica con la base de datos de SQL Database a través de un middleware de otros fabricantes, consulte con el proveedor si el middleware contiene lógica de reintento para errores transitorios.When your program communicates with your database in SQL Database through third-party middleware, ask the vendor whether the middleware contains retry logic for transient errors.

Principios de reintentoPrinciples for retry

  • Si el error es transitorio, intente volver a abrir una conexión.If the error is transient, retry to open a connection.
  • No vuelva a intentar directamente una instrucción SELECT de SQL Database o Instancia administrada de SQL que produjo un error transitorio.Do not directly retry a SQL Database or SQL Managed Instance SELECT statement that failed with a transient error. En su lugar, establezca una conexión nueva y, después, vuelva a intentar la instrucción SELECT.Instead, establish a fresh connection, and then retry the SELECT.
  • Cuando una instrucción UPDATE de SQL Database o Instancia administrada de SQL presenta un error transitorio, establezca una conexión nueva antes de volver a intentar dicha instrucción.When a SQL Database or SQL Managed Instance UPDATE statement fails with a transient error, establish a fresh connection before you retry the UPDATE. La lógica de reintento debe asegurar que se completó toda la transacción de base de datos o que toda la transacción se revirtió.The retry logic must ensure that either the entire database transaction finished or that the entire transaction is rolled back.

Otras consideraciones para el reintentoOther considerations for retry

  • Un programa por lotes que se inicia automáticamente después del horario de trabajo y que se completará antes de mañana puede permitirse el transcurso de largos intervalos de tiempo entre los reintentos.A batch program that automatically starts after work hours and finishes before morning can afford to be very patient with long time intervals between its retry attempts.
  • Un programa de la interfaz de usuario debe tener en cuenta la tendencia humana de abandonar tras una espera demasiado larga.A user interface program should account for the human tendency to give up after too long a wait. La solución no debe ser repetir el reintento cada pocos segundos porque dicha directiva puede saturar el sistema con solicitudes.The solution must not retry every few seconds, because that policy can flood the system with requests.

Aumento del intervalo entre reintentosInterval increase between retries

Se recomienda que espere 5 segundos antes del primer reintento.We recommend that you wait for 5 seconds before your first retry. Si se vuelve a intentar después de un retraso menor de 5 segundos, se correrá el riesgo de sobrecargar el servicio en la nube.Retrying after a delay shorter than 5 seconds risks overwhelming the cloud service. Para cada intento siguiente, el retraso debería aumentar exponencialmente, hasta un máximo de 60 segundos.For each subsequent retry, the delay should grow exponentially, up to a maximum of 60 seconds.

Para obtener una explicación del período de bloqueo para clientes que usan ADO.NET, vea Agrupación de conexiones de SQL Server (ADO.NET).For a discussion of the blocking period for clients that use ADO.NET, see Connection pooling (ADO.NET).

También puede establecer un número máximo de reintentos antes de que el programa se cierre automáticamente.You also might want to set a maximum number of retries before the program self-terminates.

Ejemplos de código con lógica de reintentoCode samples with retry logic

Algunos ejemplos de código con la lógica de reintento se encuentran disponibles en:Code examples with retry logic are available at:

Probar su lógica de reintentoTest your retry logic

Para probar la lógica de reintento, debe simular o producir un error que se pueda corregir mientras aún se ejecuta el programa.To test your retry logic, you must simulate or cause an error that can be corrected while your program is still running.

Prueba mediante la desconexión de la redTest by disconnecting from the network

Una forma de probar la lógica de reintento es desconectar el equipo cliente de la red mientras se ejecuta el programa.One way you can test your retry logic is to disconnect your client computer from the network while the program is running. El error es:The error is:

  • SqlException.Number = 11001SqlException.Number = 11001
  • Mensaje: "Host desconocido"Message: "No such host is known"

Como parte del primer reintento, puede volver a conectar el equipo cliente a la red y, después, intentar conectarlo.As part of the first retry attempt, you can reconnect your client computer to the network and then attempt to connect.

Para llevar a cabo esta prueba, desconecte el equipo de la red antes de iniciar el programa.To make this test practical, unplug your computer from the network before you start your program. El programa reconoce entonces un parámetro de tiempo de ejecución que hace que el programa:Then your program recognizes a runtime parameter that causes the program to:

  • Agregue temporalmente 11001 a la lista de errores para considerarlo como transitorio.Temporarily add 11001 to its list of errors to consider as transient.
  • Intente su primera conexión como de costumbre.Attempt its first connection as usual.
  • Una vez capturado el error, quite 11001 de la lista.After the error is caught, remove 11001 from the list.
  • Muestre un mensaje que indica al usuario que conecte el equipo a la red.Display a message that tells the user to plug the computer into the network.
  • Pause la ejecución mediante el método Console.ReadLine o un cuadro de diálogo con un botón Aceptar.Pause further execution by using either the Console.ReadLine method or a dialog with an OK button. El usuario presiona la tecla Entrar después de que se conecte el equipo a la red.The user presses the Enter key after the computer is plugged into the network.
  • Nuevo intento de conexión, se espera una realización correcta.Attempt again to connect, expecting success.

Realización de la prueba escribiendo mal el nombre del usuario al conectarseTest by misspelling the user name when connecting

El programa deliberadamente escribe mal el nombre de usuario antes del primer intento de conexión.Your program can purposely misspell the user name before the first connection attempt. El error es:The error is:

  • SqlException.Number = 18456SqlException.Number = 18456
  • Mensaje: "Error de inicio de sesión para el usuario 'WRONG_MyUserName'."Message: "Login failed for user 'WRONG_MyUserName'."

Como parte del primer reintento, el programa puede corregir el error ortográfico y, a continuación, intentar conectarse.As part of the first retry attempt, your program can correct the misspelling and then attempt to connect.

Para llevar a cabo esta prueba, el programa reconocerá un parámetro de tiempo de ejecución que hará que el programa:To make this test practical, your program recognizes a runtime parameter that causes the program to:

  • Agregue temporalmente 18456 a la lista de errores para considerarlo como transitorio.Temporarily add 18456 to its list of errors to consider as transient.
  • Agregue deliberadamente 'WRONG_' al nombre de usuario.Purposely add 'WRONG_' to the user name.
  • Una vez capturado el error, quite 18456 de la lista.After the error is caught, remove 18456 from the list.
  • Quite 'WRONG_' del nombre de usuario.Remove 'WRONG_' from the user name.
  • Nuevo intento de conexión, se espera una realización correcta.Attempt again to connect, expecting success.

Parámetros .NET SqlConnection para reintento de conexión.NET SqlConnection parameters for connection retry

Si el programa cliente se conecta a la base de datos de SQL Database mediante la clase System.Data.SqlClient.SqlConnection de .NET Framework, use .NET 4.6.1 o una versión posterior, o .NET Core, para poder utilizar la característica de reintento de conexión.If your client program connects to your database in SQL Database by using the .NET Framework class System.Data.SqlClient.SqlConnection, use .NET 4.6.1 or later (or .NET Core) so that you can use its connection retry feature. Para obtener más información sobre la característica, consulte la propiedad SqlConnection.ConnectionString.For more information on the feature, see SqlConnection.ConnectionString Property.

Cuando cree la cadena de conexión para su objeto SqlConnection, coordine los valores entre los parámetros siguientes:When you build the connection string for your SqlConnection object, coordinate the values among the following parameters:

  • ConnectRetryCount:  El valor predeterminado es 1.ConnectRetryCount:  Default is 1. El intervalo es de 0 a 255.Range is 0 through 255.
  • ConnectRetryInterval:  El valor predeterminado es 10 segundos.ConnectRetryInterval:  Default is 10 seconds. El intervalo es de 1 a 60.Range is 1 through 60.
  • Connection Timeout:  El valor predeterminado es 15 segundos.Connection Timeout:  Default is 15 seconds. El intervalo es de 0 a 2147483647.Range is 0 through 2147483647.

Específicamente, los valores elegidos deben cumplir la siguiente igualdad: Connection Timeout = ConnectRetryCount * ConnectionRetryIntervalSpecifically, your chosen values should make the following equality true: Connection Timeout = ConnectRetryCount * ConnectionRetryInterval

Por ejemplo, si el recuento es igual a 3 y el intervalo es igual a 10 segundos, un tiempo de espera de solo 29 segundos no proporcionará al sistema tiempo suficiente para su tercer y último reintento de conexión: 29 < 3 * 10.For example, if the count equals 3 and the interval equals 10 seconds, a timeout of only 29 seconds doesn't give the system enough time for its third and final retry to connect: 29 < 3 * 10.

Conexión frente a comandosConnection vs. command

Los parámetros ConnectRetryCount y ConnectRetryInterval permiten al objeto SqlConnection volver a intentar la operación de conexión sin indicarlo al programa o sin alterarlo, como una devolución de control al programa.The ConnectRetryCount and ConnectRetryInterval parameters let your SqlConnection object retry the connect operation without telling or bothering your program, such as returning control to your program. Los reintentos pueden producirse en las situaciones siguientes:The retries can occur in the following situations:

  • Llamada al método SqlConnection.OpenSqlConnection.Open method call
  • Llamada al método SqlConnection.ExecuteSqlConnection.Execute method call

Hay algo muy sutil que tener en cuenta.There is a subtlety. Si se produce un error transitorio mientras su consulta se está ejecutando, el objeto SqlConnection no vuelve a intentar la operación de conexión.If a transient error occurs while your query is being executed, your SqlConnection object doesn't retry the connect operation. Sin duda, no vuelve a intentar la consulta.It certainly doesn't retry your query. Sin embargo, SqlConnection comprueba muy rápidamente la conexión antes de enviar la consulta para su ejecución.However, SqlConnection very quickly checks the connection before sending your query for execution. Si la comprobación rápida detecta un problema de conexión, SqlConnection vuelve a intentar la operación de conexión.If the quick check detects a connection problem, SqlConnection retries the connect operation. Si el reintento se realiza correctamente, se envía la consulta para su ejecución.If the retry succeeds, your query is sent for execution.

¿Se debe combinar ConnectRetryCount con lógica de reintento de la aplicación?Should ConnectRetryCount be combined with application retry logic

Supongamos que su aplicación tiene una lógica de reintento personalizada.Suppose your application has robust custom retry logic. Puede reintentar la operación de conexión cuatro veces.It might retry the connect operation four times. Si agrega ConnectRetryInterval y ConnectRetryCount = 3 a la cadena de conexión, aumentará el número de reintentos a 4 * 3 = 12 reintentos.If you add ConnectRetryInterval and ConnectRetryCount =3 to your connection string, you will increase the retry count to 4 * 3 = 12 retries. Es posible que no desee un gran número de reintentos.You might not intend such a high number of retries.

Conexiones a la base de datos en SQL DatabaseConnections to your database in SQL Database

Conexión: Cadena de conexiónConnection: Connection string

La cadena de conexión necesaria para conectarse a la base de datos es ligeramente diferente de la cadena que se utiliza para conectarse a SQL Server.The connection string that's necessary to connect to your database is slightly different from the string used to connect to SQL Server. Puede copiar la cadena de conexión para la base de datos en Azure Portal.You can copy the connection string for your database from the Azure portal.

Obtenga la cadena de conexión del portal de AzureObtain the connection string from the Azure portal

Utilice Azure Portal para obtener la cadena de conexión necesaria para que su programa cliente interactúe con Azure SQL Database.Use the Azure portal to obtain the connection string that's necessary for your client program to interact with Azure SQL Database.

  1. Seleccione Todos los servicios > Bases de datos SQL.Select All services > SQL databases.

  2. Escriba el nombre de la base de datos en el cuadro de texto de filtro situado en la esquina superior izquierda de la hoja Bases de datos SQL.Enter the name of your database into the filter text box near the upper left of the SQL databases blade.

  3. Seleccione la fila correspondiente a la base de datos.Select the row for your database.

  4. Cuando aparezca la hoja de su base de datos, para una mayor comodidad visual puede seleccionar los botones Minimizar para contraer las hojas que utilizó para examinar y filtrar la base de datos.After the blade appears for your database, for visual convenience select the Minimize buttons to collapse the blades you used for browsing and database filtering.

  5. En la hoja de la base de datos, seleccione Mostrar cadenas de conexión de la base de datos.On the blade for your database, select Show database connection strings.

  6. Copie la cadena de conexión adecuada.Copy the appropriate connection string. Por ejemplo, si piensa usar la biblioteca de conexiones de ADO.NET, copie la cadena adecuada de la pestaña ADO.NET.i.e. If you intend to use the ADO.NET connection library, copy the appropriate string from the ADO.NET tab.

    Copie la cadena de conexión ADO correspondiente a la base de datos

  7. Edite la cadena de conexión según sea necesario.Edit the connection string as needed. Por ejemplo, inserte su contraseña en la cadena de conexión o quite "@<nombre del servidor>" del nombre de usuario si el nombre de servidor o el nombre de usuario es demasiado largo.i.e. Insert your password into the connection string, or remove "@<servername>" from the username if the username or server name are too long.

  8. En un formato u otro, pegue la información de la cadena de conexión en el código del programa cliente.In one format or another, paste the connection string information into your client program code.

Para obtener más información, consulte Cadenas de conexión y archivos de configuración.For more information, see Connection strings and configuration files.

Conexión: Dirección IPConnection: IP address

Debe configurar SQL Database para que acepte la comunicación desde la dirección IP del equipo que hospeda el programa cliente.You must configure SQL Database to accept communication from the IP address of the computer that hosts your client program. Para establecer esta configuración, modifique la configuración del firewall a través de Azure Portal.To set up this configuration, edit the firewall settings through the Azure portal.

Si olvida configurar la dirección IP, el programa fallará con un mensaje de error que indica la dirección IP necesaria.If you forget to configure the IP address, your program fails with a handy error message that states the necessary IP address.

  1. Inicie sesión en Azure Portal.Sign in to the Azure portal.

  2. En la lista de la izquierda, seleccione Todos los servicios.In the list on the left, select All services.

  3. Desplácese y seleccione Servidores SQL Server.Scroll and select SQL servers.

    Encontrar el servidor de Azure SQL Database en el portal

  4. En el cuadro de texto de filtro, empiece a escribir el nombre del servidor.In the filter text box, start typing the name of your server. Aparecerá su fila.Your row is displayed.

  5. Seleccione la fila para el servidor.Select the row for your server. Aparecerá una hoja para el servidor.A blade for your server is displayed.

  6. En la hoja del servidor, seleccione Configuración.On your server blade, select Settings.

  7. Seleccione Firewall.Select Firewall.

    Selección de Configuración > Firewall

  8. Seleccione Agregar IP de cliente.Select Add Client IP. Escriba un nombre para la regla nueva en el primer cuadro de texto.Type a name for your new rule in the first text box.

  9. Escriba los valores de dirección IP inferior y superior para el intervalo que quiere habilitar.Type in the low and high IP address values for the range you want to enable.

    • Puede resultar útil que el valor inferior termine en .0 y el valor alto en .255.It can be handy to have the low value end with .0 and the high value end with .255.
  10. Seleccione Guardar.Select Save.

Para más información, vea Configuración del firewall en SQL Database.For more information, see Configure firewall settings in SQL Database.

Conexión: PuertosConnection: Ports

Por lo general, debe asegurarse de que solo el puerto 1433 está abierto para la comunicación saliente en el equipo que hospeda el programa cliente.Typically, you need to ensure that only port 1433 is open for outbound communication on the computer that hosts your client program.

Por ejemplo, cuando el programa cliente está hospedado en un equipo con Windows, puede usar Firewall de Windows en el host para abrir el puerto 1433.For example, when your client program is hosted on a Windows computer, you can use Windows Firewall on the host to open port 1433.

  1. Abra el Panel de control.Open Control Panel.
  2. Seleccione Todos los elementos de Panel de control > Firewall de Windows > Configuración avanzada > Reglas de salida > Acción > Nueva regla.Select All Control Panel Items > Windows Firewall > Advanced Settings > Outbound Rules > Actions > New Rule.

Si el programa cliente se hospeda en una máquina virtual (VM) de Azure, lea Puertos más allá del 1433 para ADO.NET 4.5 y SQL Database.If your client program is hosted on an Azure virtual machine (VM), read Ports beyond 1433 for ADO.NET 4.5 and SQL Database.

Para obtener información general sobre la configuración de puertos y direcciones IP en la base de datos, vea Firewall de Azure SQL Database.For background information about configuration of ports and IP addresses in your database, see Azure SQL Database firewall.

Conexión: ADO.NET 4.6.2 o versiones posterioresConnection: ADO.NET 4.6.2 or later

Si el programa usa clases ADO.NET como System.Data.SqlClient.SqlConnection para conectarse a SQL Database, le recomendamos que use .NET Framework 4.6.2, o cualquier versión posterior.If your program uses ADO.NET classes like System.Data.SqlClient.SqlConnection to connect to SQL Database, we recommend that you use .NET Framework version 4.6.2 or later.

A partir de ADO.NET 4.6.2Starting with ADO.NET 4.6.2

  • El intento de apertura de la conexión que se va a reintentar de inmediato para Azure SQL, lo que mejora el rendimiento de aplicaciones habilitadas para la nube.The connection open attempt to be retried immediately for Azure SQL, thereby improving the performance of cloud-enabled apps.

A partir de ADO.NET 4.6.1Starting with ADO.NET 4.6.1

  • Con SQL Database, se mejora la confiabilidad si abre una conexión con el método SqlConnection.Open.For SQL Database, reliability is improved when you open a connection by using the SqlConnection.Open method. Ahora, el método Open incorpora los mejores mecanismos de reintento en respuesta a errores transitorios para determinados errores dentro del período de tiempo de espera de conexión.The Open method now incorporates best-effort retry mechanisms in response to transient faults for certain errors within the connection timeout period.
  • Se admite a agrupación de conexiones, que incluye una comprobación eficaz de que el objeto de conexión que ofrece el programa está funcionando.Connection pooling is supported, which includes an efficient verification that the connection object it gives your program is functioning.

Cuando se usa un objeto de conexión desde un grupo de conexiones, se recomienda que el programa cierre temporalmente la conexión cuando no se vaya a usar de inmediato.When you use a connection object from a connection pool, we recommend that your program temporarily closes the connection when it's not immediately in use. Volver a abrir una conexión no tiene un costo alto, pero sí lo tiene crear una nueva.It's not expensive to reopen a connection, but it is to create a new connection.

Si usa ADO.NET 4.0 o versiones anteriores, se recomienda que lo actualice a la versión de ADO.NET más reciente.If you use ADO.NET 4.0 or earlier, we recommend that you upgrade to the latest ADO.NET. Desde agosto de 2018 se puede descargar ADO.NET 4.6.2.As of August 2018, you can download ADO.NET 4.6.2.

DiagnósticoDiagnostics

Diagnóstico: Probar si las utilidades pueden conectarseDiagnostics: Test whether utilities can connect

Si el programa no puede conectarse a la base de datos en SQL Database, una opción de diagnóstico es intentar conectarse con una utilidad.If your program fails to connect to your database in SQL Database, one diagnostic option is to try to connect with a utility program. Idealmente, la utilidad se conecta mediante la misma biblioteca que usa el programa.Ideally, the utility connects by using the same library that your program uses.

En cualquier equipo con Windows, puede probar estas utilidades:On any Windows computer, you can try these utilities:

  • SQL Server Management Studio (ssms.exe), que se conecta mediante ADO.NETSQL Server Management Studio (ssms.exe), which connects by using ADO.NET
  • sqlcmd.exe, que se conecta mediante ODBCsqlcmd.exe, which connects by using ODBC

Una el programa se conecte, compruebe que funciona una breve consulta SELECT de SQL.After your program is connected, test whether a short SQL SELECT query works.

Diagnóstico: Comprobar los puertos abiertosDiagnostics: Check the open ports

Si cree que los intentos de conexión no pueden realizarse debido a problemas en los puertos, puede ejecutar una utilidad en el equipo que le informa sobre las configuraciones de los puertos.If you suspect that connection attempts fail due to port issues, you can run a utility on your computer that reports on the port configurations.

En Linux, las utilidades siguientes pueden resultar útiles:On Linux, the following utilities might be helpful:

  • netstat -nap
  • nmap -sS -O 127.0.0.1: Cambie el valor de ejemplo para que sea su dirección IP.nmap -sS -O 127.0.0.1: Change the example value to be your IP address.

En Windows, la utilidad PortQry.exe puede resultar útil.On Windows, the PortQry.exe utility might be helpful. Esta es una ejecución de ejemplo que consultó la situación del puerto en una base de datos de SQL Database y que se ejecutó en un equipo portátil:Here's an example execution that queried the port situation on a database in SQL Database and that was run on a laptop computer:

[C:\Users\johndoe\]
>> portqry.exe -n johndoesvr9.database.windows.net -p tcp -e 1433

Querying target system called: johndoesvr9.database.windows.net

Attempting to resolve name to IP address...
Name resolved to 23.100.117.95

querying...
TCP port 1433 (ms-sql-s service): LISTENING

[C:\Users\johndoe\]
>>

Diagnóstico: Registrar los erroresDiagnostics: Log your errors

A veces un problema intermitente se diagnostica mejor mediante la detección de un patrón general durante varios días o semanas.An intermittent problem is sometimes best diagnosed by detection of a general pattern over days or weeks.

El cliente puede ayudar al diagnóstico mediante el registro de todos los errores que encuentra.Your client can assist in a diagnosis by logging all errors it encounters. Puede correlacionar las entradas del registro con los datos de error que SQL Database registra internamente.You might be able to correlate the log entries with error data that SQL Database logs itself internally.

Enterprise Library 6 (EntLib60) ofrece clases administradas de .NET para ayudar con el registro.Enterprise Library 6 (EntLib60) offers .NET managed classes to assist with logging. Para más información, vea 5 - El procedimiento más sencillo: uso del bloque de aplicación de registro.For more information, see 5 - As easy as falling off a log: Use the Logging Application Block.

Diagnóstico: Examinar los registros del sistema en busca de erroresDiagnostics: Examine system logs for errors

Presentamos algunas instrucciones SELECT de Transact-SQL que consultan los registros de error y otra información.Here are some Transact-SQL SELECT statements that query error logs and other information.

Consulta de un registroQuery of log DescripciónDescription
SELECT e.*
FROM sys.event_log AS e
WHERE e.database_name = 'myDbName'
AND e.event_category = 'connectivity'
AND 2 >= DateDiff
  (hour, e.end_time, GetUtcDate())
ORDER BY e.event_category,
  e.event_type, e.end_time;
La vista sys.event_log proporciona información acerca de eventos individuales, que incluye algunos que pueden causar errores transitorios o errores de conectividad.The sys.event_log view offers information about individual events, which includes some that can cause transient errors or connectivity failures.

Idealmente, puede poner en correlación los valores start_time o end_time con información acerca de cuándo ha tenido problemas su programa cliente.Ideally, you can correlate the start_time or end_time values with information about when your client program experienced problems.

Tiene que conectarse a la base de datos maestra para ejecutar esta consulta.You must connect to the master database to run this query.
SELECT c.*
FROM sys.database_connection_stats AS c
WHERE c.database_name = 'myDbName'
AND 24 >= DateDiff
  (hour, c.end_time, GetUtcDate())
ORDER BY c.end_time;
La vista sys.database_connection_stats ofrece recuentos agregados de los tipos de eventos para realizar diagnósticos adicionales.The sys.database_connection_stats view offers aggregated counts of event types for additional diagnostics.

Tiene que conectarse a la base de datos maestra para ejecutar esta consulta.You must connect to the master database to run this query.

Diagnóstico: Buscar eventos de problema en el registro de SQL DatabaseDiagnostics: Search for problem events in the SQL Database log

Puede buscar entradas sobre los eventos de problema en el registro de SQL Database.You can search for entries about problem events in the SQL Database log. Pruebe la siguiente instrucción SELECT de Transact-SQL en la base de datos principal :Try the following Transact-SQL SELECT statement in the master database:

SELECT
   object_name
  ,CAST(f.event_data as XML).value
      ('(/event/@timestamp)[1]', 'datetime2')                      AS [timestamp]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="error"]/value)[1]', 'int')             AS [error]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="state"]/value)[1]', 'int')             AS [state]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="is_success"]/value)[1]', 'bit')        AS [is_success]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="database_name"]/value)[1]', 'sysname') AS [database_name]
FROM
  sys.fn_xe_telemetry_blob_target_read_file('el', null, null, null) AS f
WHERE
  object_name != 'login_event'  -- Login events are numerous.
  and
  '2015-06-21' < CAST(f.event_data as XML).value
        ('(/event/@timestamp)[1]', 'datetime2')
ORDER BY
  [timestamp] DESC
;

Algunas filas devueltas de sys.fn_xe_telemetry_blob_target_read_fileA few returned rows from sys.fn_xe_telemetry_blob_target_read_file

En el ejemplo siguiente se muestra el aspecto que podría tener una fila devuelta.The following example shows what a returned row might look like. Los valores nulos que se muestran no suelen ser nulos en las demás filas.The null values shown are often not null in other rows.

object_name                   timestamp                    error  state  is_success  database_name

database_xml_deadlock_report  2015-10-16 20:28:01.0090000  NULL   NULL   NULL        AdventureWorks

Enterprise Library 6Enterprise Library 6

Enterprise Library 6 (EntLib60) es un marco de clases de .NET que ayuda a implementar a clientes sólidos de servicios en la nube, uno de los cuales es SQL Database.Enterprise Library 6 (EntLib60) is a framework of .NET classes that helps you implement robust clients of cloud services, one of which is SQL Database. Para buscar temas dedicados a cada área en la que puede ayudar EntLib60 en, vea Enterprise Library 6 - April 2013 (Enterprise Library 6: abril de 2013).To locate topics dedicated to each area in which EntLib60 can assist, see Enterprise Library 6 - April 2013.

La lógica de reintento para controlar los errores transitorios es un área en la que puede ayudar EntLib60.Retry logic for handling transient errors is one area in which EntLib60 can assist. Para más información, vea 4: Perseverancia, el secreto de todos los triunfos: uso del bloque de aplicación de control de errores transitorios.For more information, see 4 - Perseverance, secret of all triumphs: Use the Transient Fault Handling Application Block.

Nota

El código fuente de EntLib60 está disponible de forma pública para descargarlo desde el Centro de descarga.The source code for EntLib60 is available for public download from the Download Center. Microsoft no tiene previsto realizar más actualizaciones de mantenimiento o de característica en EntLib.Microsoft has no plans to make further feature updates or maintenance updates to EntLib.

Clases de EntLib60 para errores transitorios y reintentosEntLib60 classes for transient errors and retry

Las siguientes clases de EntLib60 son especialmente útiles para la lógica de reintento.The following EntLib60 classes are particularly useful for retry logic. Todas esas clases se encuentran en el espacio de nombres Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.All these classes are found in or under the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.

En el espacio de nombres Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:In the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:

  • RetryPolicyRetryPolicy class
    • ExecuteActionExecuteAction method
  • ExponentialBackoffExponentialBackoff class
  • SqlDatabaseTransientErrorDetectionStrategySqlDatabaseTransientErrorDetectionStrategy class
  • ReliableSqlConnectionReliableSqlConnection class
    • ExecuteCommandExecuteCommand method

En el espacio de nombres Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:In the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:

  • AlwaysTransientErrorDetectionStrategyAlwaysTransientErrorDetectionStrategy class
  • NeverTransientErrorDetectionStrategyNeverTransientErrorDetectionStrategy class

Estos son algunos vínculos a información sobre EntLib60:Here are some links to information about EntLib60:

EntLib60: El bloque de registroEntLib60: The logging block

  • El bloque de registro es una solución muy flexible y configurable que puede usar para:The logging block is a highly flexible and configurable solution that you can use to:
    • Crear y almacenar los mensajes de registro en una amplia variedad de ubicaciones.Create and store log messages in a wide variety of locations.
    • Clasificar y filtrar los mensajes.Categorize and filter messages.
    • Recopilar la información contextual es útil para la depuración y el seguimiento, así como para los requisitos de registro generales y de auditoría.Collect contextual information that is useful for debugging and tracing, as well as for auditing and general logging requirements.
  • El bloque de registro abstrae la funcionalidad de registro desde el destino de registro para que el código de la aplicación sea coherente, con independencia de la ubicación y del tipo de almacén de registro de destino.The logging block abstracts the logging functionality from the log destination so that the application code is consistent, irrespective of the location and type of the target logging store.

Para más información, vea 5 - El procedimiento más sencillo: uso del bloque de aplicación de registro.For more information, see 5 - As easy as falling off a log: Use the Logging Application Block.

Código fuente del método IsTransient de EntLib60EntLib60 IsTransient method source code

A continuación, en la clase SqlDatabaseTransientErrorDetectionStrategy, se encuentra el código fuente de C# para el método IsTransient.Next, from the SqlDatabaseTransientErrorDetectionStrategy class, is the C# source code for the IsTransient method. Desde abril de 2013, el código fuente explica qué errores se consideran transitorios y dignos de reintento.The source code clarifies which errors were considered transient and worthy of retry, as of April 2013.

public bool IsTransient(Exception ex)
{
  if (ex != null)
  {
    SqlException sqlException;
    if ((sqlException = ex as SqlException) != null)
    {
      // Enumerate through all errors found in the exception.
      foreach (SqlError err in sqlException.Errors)
      {
        switch (err.Number)
        {
            // SQL Error Code: 40501
            // The service is currently busy. Retry the request after 10 seconds.
            // Code: (reason code to be decoded).
          case ThrottlingCondition.ThrottlingErrorNumber:
            // Decode the reason code from the error message to
            // determine the grounds for throttling.
            var condition = ThrottlingCondition.FromError(err);

            // Attach the decoded values as additional attributes to
            // the original SQL exception.
            sqlException.Data[condition.ThrottlingMode.GetType().Name] =
              condition.ThrottlingMode.ToString();
            sqlException.Data[condition.GetType().Name] = condition;

            return true;

          case 10928:
          case 10929:
          case 10053:
          case 10054:
          case 10060:
          case 40197:
          case 40540:
          case 40613:
          case 40143:
          case 233:
          case 64:
            // DBNETLIB Error Code: 20
            // The instance of SQL Server you attempted to connect to
            // does not support encryption.
          case (int)ProcessNetLibErrorCode.EncryptionNotSupported:
            return true;
        }
      }
    }
    else if (ex is TimeoutException)
    {
      return true;
    }
    else
    {
      EntityException entityException;
      if ((entityException = ex as EntityException) != null)
      {
        return this.IsTransient(entityException.InnerException);
      }
    }
  }

  return false;
}

Pasos siguientesNext steps