Solución de problemas de conectividad y otros errores con base de datos de Azure SQL y Azure SQL Managed Instance

Se aplica a:Azure SQL DatabaseAzure SQL Managed Instance

Cuando la conexión a Azure SQL Database o Azure SQL Managed Instance no se logra establecer, se reciben mensajes de error.

Como siempre, aplique los procedimientos recomendados y las directrices de diseño durante el proceso de diseño de aplicaciones.

Nota:

Puede usar la Comprobación de conectividad de Azure SQL para detectar y corregir una amplia variedad de errores de conectividad en entornos de Azure SQL Database, Azure SQL Managed Instance y Azure Synapse Analytics.

Pasos para solucionar problemas de conexión comunes

  1. Asegúrese de que TCP/IP esté habilitado como protocolo de cliente en el servidor de aplicaciones. En los servidores de aplicaciones en los que no tiene instaladas herramientas de SQL, compruebe que TCP/IP esté habilitado mediante la ejecución de cliconfg.exe (utilidad de red de cliente de SQL Server).

  2. Compruebe la cadena de conexión de la aplicación para asegurarse de que está configurada correctamente. Por ejemplo, asegúrese de que la cadena de conexión especifica el puerto correcto (1433) y el nombre completo del servidor. Consulte Obtención de información de conexión mediante SQL Server Management Studio.

  3. Intente aumentar el valor de tiempo de espera de la conexión. Se recomienda el uso de un tiempo de espera de conexión de al menos 30 segundos.

  4. Pruebe la conectividad entre el servidor de aplicaciones y la instancia de Azure SQL Database mediante SQL Server Management Studio (SSMS), un archivo UDL, ping o Telnet. Para más información, consulte Solución de problemas de conectividad y Diagnóstico de problemas de conexión.

    Nota

    Como paso de solución de problemas, también puede probar la conectividad en otro equipo cliente.

  5. Como procedimiento recomendado, las aplicaciones conectadas a la nube deben usar lógica de reintento.

Si con los pasos anteriores no se resuelve el problema, intente recopilar más datos y luego póngase en contacto con el soporte técnico. Si la aplicación es un servicio en la nube, habilite el registro. Este paso devuelve una marca de tiempo UTC del error. Para más información sobre cómo habilitar el registro, consulte Habilitar el registro de diagnósticos para las aplicaciones de Azure App Service. Además, SQL Database devuelve el identificador de seguimiento. Los servicios de soporte técnico de Microsoft pueden usar esta información.

Implementación de la lógica de reintento

Se recomienda encarecidamente que las aplicaciones cliente tengan lógica de reintento para poder tratar de restablecer una conexión después de dar tiempo a que se corrijan los errores transitorios. Se recomienda un retraso de 5 segundos antes del primer reintento. Si se vuelve a intentar después de un retraso de menos de 5 segundos, se correrá el riesgo de sobrecargar el servicio en la nube. Para cada intento siguiente, el retraso debería aumentar exponencialmente, hasta un máximo de 60 segundos.

Para obtener ejemplos de lógica de reintento, vea:

Para más información sobre el control de errores transitorios en la aplicación, consulte Solución de problemas de errores de conexión transitorios en SQL Database

Una explicación del período de bloqueo para clientes que usan ADO.NET está disponible en Grupos de conexión (ADO.NET).

Mensajes de error transitorios (40197, 40613 y otros)

La infraestructura de Azure ofrece la posibilidad de volver a configurar dinámicamente servidores cuando surgen cargas de trabajo pesadas en el servicio de SQL Database. Este comportamiento dinámico podría dar lugar a que el programa cliente perdiera su conexión a la base de datos o la instancia. Este tipo de condición de error se conoce como error transitorio. Los eventos de reconfiguración de la base de datos se producen debido a un evento planeado (por ejemplo, una actualización de software) o a un evento no planeado (por ejemplo, el bloqueo de un proceso o un equilibrio de carga). La mayoría de los eventos de reconfiguración son de corta duración y se completarán en menos de 60 segundos. Sin embargo, ocasionalmente estos eventos pueden tardar más tiempo de finalizar, por ejemplo, cuando una transacción grande produce una recuperación de larga duración. En la tabla siguiente se enumeran varios errores transitorios que las aplicaciones pueden recibir al conectarse a Azure SQL Database.

Lista de códigos de error transitorios

Código de error severity Descripción
926 14 Database 'replicatedmaster' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server error log for more information.

Este error puede incluirse en el registro de errores de SQL Managed Instance, por un breve período de tiempo, durante la última fase de una reconfiguración, mientras la antigua base de datos principal cierra su registro.
Otros escenarios no transitorios que implican este mensaje de error se describen en la documentación de errores de MSSQL.
4060 16 Cannot open database "%.*ls" requested by the login. The login failed.

Para obtener más información, consulte los errores de 4000 a 4999.
40197 17 The service has encountered an error processing your request. Please try again. Error code %d.

Recibirá este error cuando el servicio esté inactivo debido a actualizaciones de software o hardware, errores de hardware u otros problemas de conmutación por error. El código de error (%d) incrustado en el mensaje de error 40197 proporciona información adicional sobre el tipo de error o conmutación por error que se ha producido. Algunos ejemplos de los códigos de error que se incrustan dentro del mensaje de error 40197 son 40020, 40143, 40166 y 40540.

Al volver a conectarse, se conectará automáticamente a una copia correcta de su base de datos. La aplicación debe detectar el error 40197, registrar el código de error incrustado (%d) dentro del mensaje para solucionar problemas y volver a conectarse a SQL Database hasta que los recursos estén disponibles; entonces, la conexión se establecerá de nuevo. Para obtener más información, vea Errores transitorios.
40501 20 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Para obtener más información, consulte:
Límites de recursos de servidores SQL lógicos.
Límites basados en DTU para bases de datos únicas.
Límites basados en DTU para grupos elásticos.
Límites basados en núcleos virtuales para bases de datos únicas.
Límites de recursos para grupos elásticos que usan el modelo de compra de núcleo virtual
Límites de recursos de Azure SQL Managed Instance.
40613 17 Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'.

Este error puede producirse si ya existe una conexión de administrador dedicada (DAC) establecida en la base de datos. Para obtener más información, vea Errores transitorios.
49918 16 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later.

Para obtener más información, consulte:
Límites de recursos de servidores SQL lógicos.
Límites basados en DTU para bases de datos únicas.
Límites basados en DTU para grupos elásticos.
Límites basados en núcleos virtuales para bases de datos únicas.
Límites de recursos para grupos elásticos que usan el modelo de compra de núcleo virtual
Límites de recursos de Azure SQL Managed Instance.
49919 16 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".

El servicio está ocupado procesando varias solicitudes de creación o actualización para su suscripción o servidor. Actualmente las solicitudes están bloqueadas para la optimización de recursos. Consulte sys.dm_operation_status para ver las operaciones pendientes. Espere a que se completen las solicitudes de creación o actualización pendientes o elimine una de las solicitudes pendientes y vuelva a intentar la solicitud más tarde. Si las operaciones parecen estar bloqueadas, espere a que se completen otras operaciones en curso o cancélelas cuando sea posible. Por ejemplo, puede cancelar una copia de base de datos o la creación de una réplica geográfica eliminando la base de datos o la réplica que se está creando. Si no puede cancelar una operación aparentemente bloqueada, abra una incidencia de soporte técnico con Microsoft.
49920 16 Cannot process request. Too many operations in progress for subscription "%ld".

El servicio está ocupado procesando varias solicitudes para esta suscripción. Actualmente las solicitudes están bloqueadas para la optimización de recursos. Consulta sys.dm_operation_status para el estado de la operación. Espere a que las solicitudes pendientes se hayan completado o elimine una de las solicitudes pendientes y vuelva a intentar la solicitud más tarde. Si las operaciones parecen estar bloqueadas, espere a que se completen otras operaciones en curso o cancélelas cuando sea posible. Por ejemplo, puede cancelar una copia de base de datos o la creación de una réplica geográfica eliminando la base de datos o la réplica que se está creando. Si no puede cancelar una operación aparentemente bloqueada, abra una incidencia de soporte técnico con Microsoft.
4221 16 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.

La réplica no está disponible para el inicio de sesión porque faltan las versiones de las filas de transacciones que estaban en proceso cuando se recicló la réplica. Se puede resolver el problema al revertir o asignar las transacciones activas en la réplica principal. Se pueden minimizar las repeticiones de esta condición al evitar escribir transacciones en la principal.
615 21 Could not find database ID %d, name '%.*ls'

Esto significa que la caché en memoria no está sincronizada con la instancia de SQL Server y que las búsquedas recuperan el id. de base de datos obsoleto.

Los inicios de sesión de SQL usan la caché en memoria para obtener la asignación de nombre de la base de datos a id. La caché debe estar sincronizada con la base de datos del back-end y actualizada siempre que se asocie y desasocie la base de datos de SQL Server.
Recibe este error cuando el flujo de trabajo de desasociación no puede limpiar la caché en memoria a tiempo y las búsquedas posteriores en la base de datos apuntan a un id. de base de datos obsoleto.

Intente la reconexión a SQL Database hasta que los recursos estén disponibles y la conexión se establezca de nuevo. Para obtener más información, vea Errores transitorios.

Pasos para resolver los problemas de conectividad transitorios

  1. Compruebe el panel de servicios de Microsoft Azure para comprobar si se produjeron interrupciones durante el tiempo en el que la aplicación informó de los errores.
  2. Para las aplicaciones que se conectan a un servicio en la nube, como base de datos de Azure SQL, se deben prever eventos periódicos de reconfiguración e implementar la lógica de reintento para gestionar estos errores en lugar de mostrar los errores de la aplicación a los usuarios.
  3. Conforme una base de datos se acerca a sus límites de recursos, puede parecer un problema de conectividad transitorio. Consulte Límites de los recursos.
  4. Si los problemas de conectividad continúan, si el tiempo de detección del error por parte de la aplicación supera los 60 segundos o si el error se repite varias veces en un día determinado, realice una solicitud de soporte técnico a Azure; para ello, seleccione Obtener soporte en el sitio Soporte técnico de Azure .

El problema se produce si la aplicación no se puede conectar al servidor.

Para resolver este problema, pruebe los pasos (en orden) de la sección Pasos para solucionar problemas de conexión comunes.

No se detectó el servidor/instancia o no estaba accesible (errores 26, 40, 10053)

Error 26: Error al buscar el servidor especificado

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.(provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)

Error 40: No se pudo abrir una conexión al servidor

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

Error 10053: Error en el nivel del transporte al recibir los resultados del servidor.

10053: A transport-level error has occurred when receiving results from the server. (Provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine)

Estos problemas se producen si la aplicación no se puede conectar al servidor.

Para resolver estos problemas, pruebe los pasos (en orden) de la sección Pasos para solucionar problemas de conexión comunes.

No se puede conectar al servidor por problemas de firewall

Error 40615: No se puede conectar a <nombredelservidor>

Para resolver este problema, configure un firewall en SQL Database con Azure Portal.

Error 5: No se puede conectar a <nombredelservidor>

Para resolver este problema, asegúrese de que el puerto 1433 está abierto para las conexiones salientes en todos los firewalls entre el cliente e Internet.

No se puede iniciar sesión en el servidor (errores 18456, 40531)

Error de inicio de sesión del usuario "<nombre de usuario>".

Login failed for user '<User name>'.This session has been assigned a tracing ID of '<Tracing ID>'. Provide this tracing ID to customer support when you need assistance. (Microsoft SQL Server, Error: 18456)

Para resolver este problema, póngase en contacto con el administrador de servicios para que le proporcione un nombre de usuario y una contraseña válidos.

Normalmente, el administrador de servicio puede usar los siguientes pasos para agregar las credenciales de inicio de sesión:

  1. Inicie sesión en el servidor mediante SQL Server Management Studio (SSMS).

  2. Para comprobar si el nombre de inicio de sesión está deshabilitado, ejecute la siguiente consulta SQL en la base de datos master:

    SELECT name, is_disabled FROM sys.sql_logins;
    
  3. Si el nombre correspondiente está deshabilitado, puede que decirla habilitarlo mediante la instrucción siguiente:

    ALTER LOGIN <User name> ENABLE;
    
  4. Si el nombre de usuario de inicio de sesión SQL no existe, edite y ejecute la siguiente consulta SQL para crear un inicio de sesión SQL:

    CREATE LOGIN <SQL_login_name, sysname, login_name>
    WITH PASSWORD = '<password, sysname, Change_Password>';
    GO
    
  5. En el Explorador de objetos de SSMS, expanda Bases de datos.

  6. Seleccione la base de datos para la que desea conceder permiso al usuario.

  7. Haga clic con el botón derecho en Seguridad y, después, seleccione Nuevo, Ususario.

  8. En el script generado con marcadores de posición, siga los pasos para sustituir los parámetros de la plantilla SSMS y ejecutarlo, por ejemplo:

    CREATE USER [<user_name, sysname, user_name>]
    FOR LOGIN [<login_name, sysname, login_name>]
    WITH DEFAULT_SCHEMA = [<default_schema, sysname, dbo>];
    GO
    
    -- Add user to the database owner role
    EXEC sp_addrolemember N'db_owner', N'<user_name, sysname, user_name>';
    GO
    

    también puede utilizar sp_addrolemember para asignar usuarios específicos a roles de base de datos específicos.

    Nota

    En Azure SQL Database, considere la sintaxis ALTER ROLE más reciente para administrar la pertenencia al rol de la base de datos.

Para más información, consulte Administración de bases de datos e inicios de sesión en Azure SQL Database.

Errores de tiempo de espera de conexión agotado

System.Data.SqlClient.SqlException (0x80131904): Tiempo de espera de conexión agotado

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=3; handshake=29995;

System.Data.SqlClient.SqlException (0x80131904): Tiempo de espera agotado

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

System.Data.Entity.Core.EntityException: Error del proveedor subyacente en [Abierto]

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. -> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. -> System.ComponentModel.Win32Exception: The wait operation timed out

No se puede conectar a <nombre del servidor>.

Cannot connect to <server name>.ADDITIONAL INFORMATION:Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=231; handshake=983; [Login] initialization=0; authentication=0; [Post-Login] complete=13000; (Microsoft SQL Server, Error: -2) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=-2&LinkId=20476 The wait operation timed out

Estas excepciones pueden producirse por problemas de conexión o de consulta. Para confirmar que este error se debe a problemas de conectividad, consulte Confirmación de si un error se debe a un problema de conectividad.

Los tiempos de espera de conexión se producen porque la aplicación no se puede conectar al servidor. Para resolver este problema, pruebe los pasos (en orden) de la sección Pasos para solucionar problemas de conexión comunes.

Errores de terminación de la conexión de red

Las bibliotecas cliente SQL se conectan a Azure SQL Database y Azure SQL Managed Instance mediante el protocolo de red TCP. Una biblioteca cliente usa un componente de nivel inferior denominado proveedor TCP para administrar conexiones TCP. Cuando el proveedor TCP detecta que un host remoto ha finalizado inesperadamente una conexión TCP existente, la biblioteca cliente genera un error. Dado que el error es un error de cliente y no un error de SQL Server, no se incluye ningún número de error de SQL. En su lugar, el número de error es 0 y se usa el mensaje de error del proveedor TCP.

Entre los ejemplos de errores de terminación de la conexión de red se incluyen:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) An existing connection was forcibly closed by the remote host

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following: the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Los errores de terminación de la conexión pueden deberse a que la base de datos o el grupo elástico no están disponibles temporalmente. También pueden producirse debido a varios problemas en la infraestructura de red entre el servidor de bases de datos y la aplicación cliente, incluidos firewalls, dispositivos de red, etc. Estos problemas pueden ser transitorios o permanentes. Como guía general, las aplicaciones deben usar un número fijo de reintentos para estos errores antes de considerarlos errores permanentes.

Errores de gobernanza de recursos

Azure SQL Database usa una implementación de gobierno de recursos basada en Resource Governor para imponer límites de recursos. Obtenga más información sobre la administración de recursos en Azure SQL Database.

La mayoría de los errores de gobierno de recursos se muestran primero con detalles, seguidos de una tabla de los mensajes de error de gobierno de recursos.

Errores 10928 y 10936: Id. de recurso: 1. El límite de solicitudes para la [base de datos o el grupo elástico] es %d y se ha alcanzado.

Si se alcanza el límite de nivel de base de datos, el mensaje de error detallado en este caso dice lo siguiente: Resource ID : 1. The request limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

Si se alcanza el límite del grupo elástico, el mensaje de error detallado en este caso indica lo siguiente: Resource ID : 1. The request limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. Los límites del grupo elástico son mayores que los límites de la base de datos, para más información, vea Límites de recursos. Se pueden alcanzar los límites cuando varias bases de datos del grupo usan un recurso (por ejemplo, trabajos) simultáneamente.

Este mensaje de error indica que se ha alcanzado el límite de trabajos para la base de datos o el grupo elástico. El valor de máximo de trabajos simultáneos del objetivo de servicio de la base de datos o el grupo elástico estará presente en lugar del marcador de posición %d.

Nota

La oferta inicial de Azure SQL Database solo admitía consultas de un único subproceso. En ese momento, el número de solicitudes siempre equivalía al número de trabajos. Los mensajes de error 10928 y 10936 de Azure SQL Database contienen el texto "El límite de solicitudes [...] es N y se ha alcanzado" por compatibilidad con versiones anteriores. El límite alcanzado es, en realidad, el número de trabajos. Si el valor de grado máximo de paralelismo (MAXDOP) es igual a cero o es mayor que uno, el número de trabajos puede ser mucho mayor que el número de solicitudes y el límite podría alcanzarse mucho antes que cuando MAXDOP es igual a uno.

Obtenga más información sobre Sesiones, trabajos y solicitudes.

Conexión con la conexión de administrador dedicada (DAC) si es necesario

Si hay un incidente en curso en el que se ha alcanzado el límite de trabajos, puede que reciba el error 10928 al conectarse con SQL Server Management Studio (SSMS) o Azure Data Studio. Una sesión puede conectarse con la conexión de diagnóstico para administradores de bases de datos (DAC) incluso cuando se ha alcanzado el umbral máximo de trabajo.

Para establecer una conexión con la DAC desde SSMS:

  • En el menú, seleccione Archivo > Nuevo > Consulta de motor de base de datos.
  • En el cuadro de diálogo conexión del campo Nombre del servidor, escriba admin:<fully_qualified_server_name> (por ejemplo, admin:servername.database.windows.net).
  • Seleccione Opciones >>.
  • Seleccione la pestaña Propiedades de la conexión.
  • En el cuadro Conectar a base de datos: escriba el nombre de la base de datos.
  • Seleccione Conectar.

Si recibe el error 40613, Database '%.&#x2a;ls' on server '%.&#x2a;ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '%.&#x2a;ls', esto puede indicar que ya hay otra sesión conectada a la DAC. Solo puede conectarse una sesión a la DAC para una sola base de datos o un grupo elástico de forma simultánea.

Si aparece el error "Error al conectarse al servidor" después de seleccionar Conectar, es posible que la sesión de DAC se haya establecido correctamente si usa una versión de SSMS anterior a la 18.9. Las versiones anteriores de SSMS intentaron proporcionar Intellisense para las conexiones a la DAC. No fue posible, ya que la DAC solo admite un solo trabajo e Intellisense requiere un trabajo independiente.

No puede usar una conexión DAC con el Explorador de objetos en SSMS.

Revisión del uso de max_worker_percent

Para obtener estadísticas de consumo de recursos para la base de datos de los últimos 14 días, realice una consulta a la vista de catálogo del sistema sys.resource_stats. En la columna max_worker_percent se muestra el porcentaje de trabajos usados en relación con el límite de trabajos de la base de datos. Conéctese a la base de datos master del servidor lógico para realizar la consulta a sys.resource_stats.

SELECT start_time, end_time, database_name, sku, avg_cpu_percent, max_worker_percent, max_session_percent 
FROM sys.resource_stats;

También puede realizar una consulta de las estadísticas de consumo de recursos de la última hora desde la vista de administración dinámica sys.dm_db_resource_stats. Conéctese directamente a la base de datos para realizar una consulta a sys.dm_db_resource_stats.

SELECT end_time, avg_cpu_percent, max_worker_percent, max_session_percent
FROM sys.dm_db_resource_stats;

Reducción del uso de los trabajos cuando sea posible

El bloqueo de cadenas puede provocar un aumento súbito del número de trabajos en una base de datos. Un gran volumen de consultas paralelas simultáneas puede causar un número elevado de trabajos. Si aumenta el grado máximo de paralelismo (MAXDOP) o establece MAXDOP en cero puede aumentar el número de trabajos activos.

Para evitar un incidente con trabajos insuficientes, siga estos pasos:

  1. Investigue si se está produciendo un bloqueo o si puede identificar un gran volumen de trabajos simultáneos. Ejecute la consulta siguiente para examinar las solicitudes actuales y comprobar si hay un bloqueo cuando la base de datos devuelva el error 10928. Es posible que tenga que conectarse con la conexión de administrador dedicada (DAC) para ejecutar la consulta.

    SELECT
        r.session_id, r.request_id, r.blocking_session_id, r.start_time, 
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        (SELECT COUNT(*) 
            FROM sys.dm_os_tasks AS t 
            WHERE t.session_id=r.session_id and t.request_id=r.request_id) AS worker_count,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1;
    GO
    
    1. Busque filas con blocking_session_id para identificar las sesiones bloqueadas. Busque cada blocking_session_id en la lista para determinar si esa sesión también está bloqueada. Al seguir los valores blocking_session_id y session_id, finalmente, se le dirigirá al bloqueador principal: una sesión que no está bloqueada, pero que bloquea. Optimice la consulta del bloqueador de encabezado.

      Sugerencia

      Para más información sobre cómo solucionar problemas de consultas de bloqueo o de larga duración, vea Descripción y resolución de los problemas de bloqueo de Azure SQL Database.

    2. Para identificar un gran volumen de trabajos simultáneos, revise el número de solicitudes en general y la columna worker_count de cada solicitud. Worker_count es el número de trabajos en el momento de la muestra y puede cambiar a lo largo del tiempo a medida que se ejecuta la solicitud. Ajuste las consultas para reducir el uso de recursos si la causa del aumento de los trabajos son consultas simultáneas que se ejecutan en su grado óptimo de paralelismo. Para más información, consulte Optimización y sugerencias de consultas.

  2. Evalúe el grado máximo de paralelismo (MAXDOP) de la base de datos.

Aumento de los límites de trabajos

Si la base de datos o el grupo elástico alcanzan su límite de trabajo de forma coherente a pesar de haber solucionado el bloqueo, optimizado consultas y validado la configuración de MAXDOP, le recomendamos que escale verticalmente la base de datos o el grupo elástico para aumentar el límite de trabajos.

Encuentre límites de recursos Azure SQL Database por nivel de servicio y tamaño de proceso a continuación:

Obtenga más información sobre el gobierno de trabajos de recursos de Azure SQL Database.

Error 10929: Identificador de recurso: 1

10929: Resource ID: 1. The %s minimum guarantee is %d, maximum limit is %d and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. See http://go.microsoft.com/fwlink/?LinkId=267637 for assistance. Otherwise, please try again later.

Error 40501: El servicio está ocupado actualmente

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

El error 40501 es un error de limitación del motor, que indica que se superan los límites de los recursos.

Para más información sobre los límites de recursos, consulte Límites de recursos de servidores SQL lógicos.

Error 40544: La base de datos ha alcanzado su cuota de tamaño

40544: The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Incident ID: <ID>. Code: <code>.

Este error se produce cuando la base de datos ha alcanzado su cuota de tamaño.

Los pasos siguientes pueden ayudarle a solucionar el problema o proporcionarle más opciones:

  1. Compruebe el tamaño actual de la base de datos mediante el panel en Azure Portal.

    Nota

    Para identificar qué tablas consumen más espacio y, por lo tanto, son posibles candidatos para la limpieza, ejecute la siguiente consulta SQL:

    SELECT o.name,
     SUM(p.row_count) AS 'Row Count',
     SUM(p.reserved_page_count) * 8.0 / 1024 AS 'Table Size (MB)'
    FROM sys.objects o
    JOIN sys.dm_db_partition_stats p on p.object_id = o.object_id
    GROUP BY o.name
    ORDER BY [Table Size (MB)] DESC;
    GO
    
  2. Si el tamaño actual no supera el tamaño máximo admitido para la versión, puede usar ALTER DATABASE para aumentar el valor de MAXSIZE.

  3. Si la base de datos ya supera el tamaño máximo admitido para la edición, pruebe uno o varios de los pasos siguientes:

    • Realice actividades normales de limpieza de la base de datos. Por ejemplo, limpie los datos no deseados con truncar o eliminar, o bien mueva los datos con SQL Server Integration Services (SSIS) o el programa de copia masiva (bcp).
    • Cree particiones o elimine datos, quite índices o consulte la documentación para obtener soluciones posibles.
    • Para el escalado de la base de datos, consulte Escalar recursos de base de datos única y Escalar recursos de grupos elásticos.

Error 40549: La sesión terminó porque tiene una transacción de larga duración

40549: Session is terminated because you have a long-running transaction. Try shortening your transaction.

Si se encuentra con frecuencia este mensaje de error, siga estos pasos para intentar resolver el problema:

  1. Ejecute la consulta siguiente para ver las sesiones abiertas que tengan un valor elevado en la columna duration_ms:

    SELECT
        r.start_time, DATEDIFF(ms,start_time, SYSDATETIME()) as duration_ms, 
        r.session_id, r.request_id, r.blocking_session_id,  
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1
    ORDER BY start_time ASC;
    GO
    

    Puede elegir ignorar las filas en las que la columna input_buffer tenga una lectura de consulta de sys.fn_MSxe_read_event_stream: estas solicitudes están relacionadas con sesiones de eventos extendidos.

  2. Revise la columna blocking_session_id para ver si el bloqueo contribuye a transacciones de larga duración.

    Nota

    Para obtener más información sobre la solución de problemas de bloqueo en Azure SQL Database, consulte Descripción y resolución de problemas de bloqueo en Azure SQL Database.

  3. Le recomendamos que procese por lotes las consultas. Para más información sobre el procesamiento por lotes, consulte Uso del procesamiento por lotes para mejorar el rendimiento de las aplicaciones de SQL Database.

Error 40551: La sesión se ha terminado debido al uso excesivo de tempdb

40551: The session has been terminated because of excessive TEMPDB usage. Try modifying your query to reduce the temporary table space usage.

Para resolver el problema, siga estos pasos:

  1. Modifique las consultas para reducir el uso del espacio de la tabla temporal.
  2. Quite los objetos temporales cuando ya no se necesiten.
  3. Trunque las tablas o quite las que no se usen.

Error 40552: La sesión ha terminado debido al uso excesivo del espacio de registro de transacciones

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Para resolver este problema, pruebe los métodos siguientes:

Error 40553: La sesión ha terminado debido al uso excesivo de la memoria

40553: The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Para solucionar este problema, intente optimizar la consulta.

Para un procedimiento de solución de problemas detallado, consulte ¿Se ejecuta correctamente mi consulta en la nube?

Para más información sobre otros errores de memoria insuficiente y consultas de ejemplo, vea Solución de problemas de errores de memoria insuficiente con Azure SQL Database.

Tabla de mensajes de error de gobierno de recursos

Código de error severity Descripción
10928 20 Resource ID: %d. The %s limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

El identificador de recurso indica el recurso que ha alcanzado el límite. Cuando el id. de recurso es igual a 1, esto indica que se ha alcanzado un límite de trabajos. Obtenga más información en Error 10928: Resource ID : 1. The request limit for the database is %d and has been reached. Cuando el id. de recurso es igual a 2, esto indica que se ha alcanzado el límite de sesión.

Más información sobre los límites de recursos:
Límites de recursos de servidores SQL lógicos.
Límites basados en DTU para bases de datos únicas.
Límites basados en núcleos virtuales para bases de datos únicas.
Límites de recursos de Azure SQL Managed Instance.
10936 20 Resource ID: %d. The %s limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

El identificador de recurso indica el recurso que ha alcanzado el límite. Cuando el id. de recurso es igual a 1, esto indica que se ha alcanzado un límite de trabajos. Obtenga más información en Error 10936: Id. de recurso: 1. El límite de solicitudes para el grupo elástico es %d y se ha alcanzado.. Cuando el id. de recurso es igual a 2, esto indica que se ha alcanzado el límite de la sesión.

Más información sobre los límites de recursos:
Límites de recursos de servidores SQL lógicos.
Límites basados en DTU para grupos elásticos.
Límites de recursos para grupos elásticos que usan el modelo de compra de núcleo virtual
Límites de recursos de Azure SQL Managed Instance.
10929 20 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

El identificador de recurso indica el recurso que ha alcanzado el límite. Para subprocesos de trabajo, el id. de recurso = 1. Para las sesiones, Identificador de recurso = 2. Para más información, vea lo siguiente:
Límites de recursos de servidores SQL lógicos.
Límites basados en DTU para bases de datos únicas.
Límites basados en DTU para grupos elásticos.
Límites basados en núcleos virtuales para bases de datos únicas.
Límites de recursos para grupos elásticos que usan el modelo de compra de núcleo virtual
Límites de recursos de Azure SQL Managed Instance.
De lo contrario, vuelva a intentarlo más tarde.
40544 20 The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.

Para el escalado de la base de datos, consulte Escalar recursos de base de datos única y Escalar recursos de grupos elásticos.
40549 16 Session is terminated because you have a long-running transaction. Try shortening your transaction.

Para más información sobre el procesamiento por lotes, consulte Uso del procesamiento por lotes para mejorar el rendimiento de las aplicaciones de SQL Database.
40550 16 The session has been terminated because it has acquired too many locks. Try reading or modifying fewer rows in a single transaction.

Para más información sobre el procesamiento por lotes, consulte Uso del procesamiento por lotes para mejorar el rendimiento de las aplicaciones de SQL Database.
40551 16 The session has been terminated because of excessive tempdb usage. Try modifying your query to reduce the temporary table space usage.

Si está usando objetos temporales, puede ahorrar espacio en la base de datos tempdb quitándolos una vez que la sesión ya no los necesite. Para obtener más información sobre los límites de tempdb en SQL Database, consulte Base de datos tempdb en SQL Database.
40552 16 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Para más información sobre el procesamiento por lotes, consulte Uso del procesamiento por lotes para mejorar el rendimiento de las aplicaciones de SQL Database.

Si realiza inserciones masivas con la utilidad bcp.exe o la clase System.Data.SqlClient.SqlBulkCopy, intente usar las opciones -b batchsize o BatchSize para limitar el número de filas copiadas al servidor en cada transacción. Si está volviendo a crear un índice con la instrucción ALTER INDEX, intente usar la opción REBUILD WITH ONLINE = ON. Para obtener información sobre los tamaños del registro de transacciones para el modelo de compra de núcleo virtual, consulte:
Límites basados en núcleos virtuales para bases de datos únicas.
Límites de recursos para grupos elásticos que usan el modelo de compra de núcleo virtual
Límites de recursos de Azure SQL Managed Instance.
40553 16 The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

La reducción del número de operaciones ORDER BY y GROUP BY en el código Transact-SQL disminuye los requisitos de memoria de la consulta. Para el escalado de la base de datos, consulte Escalar recursos de base de datos única y Escalar recursos de grupos elásticos. Para más información sobre errores de memoria insuficiente y consultas de ejemplo, vea Solución de problemas de errores de memoria insuficiente con Azure SQL Database.

Errores de grupos elásticos

Los errores siguientes están relacionados con la creación y el uso de grupos elásticos:

Código de error severity Descripción Acción correctiva
1132 17 The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (%d) MBs.

Se ha intentado escribir datos en una base de datos cuando se ha alcanzado el límite de almacenamiento del grupo elástico. Para obtener información sobre los límites de recursos, consulte:
Límites basados en DTU para grupos elásticos.
Límites de recursos para grupos elásticos que usan el modelo de compra de núcleo virtual
Considere la posibilidad de incrementar el número de DTU y de agregar almacenamiento al grupo elástico si es posible para aumentar su límite de almacenamiento, reducir el almacenamiento usado por las bases de datos individuales del grupo elástico o quitar bases de datos de este. Para la escalada del grupo elástico, consulte Escalar recursos de grupos elásticos. Para obtener más información sobre cómo quitar el espacio no utilizado de las bases de datos, vea Administración del espacio de archivo para bases de datos en Azure SQL Database.
10929 16 The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

Para obtener información sobre los límites de recursos, consulte:
Límites basados en DTU para grupos elásticos.
Límites de recursos para grupos elásticos que usan el modelo de compra de núcleo virtual
De lo contrario, vuelva a intentarlo más tarde. Número mínimo de DTU o de núcleos virtuales por base de datos; número máximo de DTU o de núcleos virtuales por base de datos. El número total de trabajos simultáneos de todas las bases de datos del grupo elástico intentó superar el límite del grupo.
Considere la posibilidad de incrementar el número de DTU o de núcleos virtuales del grupo elástico si es posible para aumentar el límite de trabajadores, o bien quite bases de datos del grupo elástico.
40844 16 Database '%ls' on Server '%ls' is a '%ls' edition database in an elastic pool and cannot have a continuous copy relationship. N/D
40857 16 Elastic pool not found for server: '%ls', elastic pool name: '%ls'. Specified elastic pool does not exist in the specified server. Especifique un nombre de grupo elástico válido.
40858 16 Elastic pool '%ls' already exists in server: '%ls'. Specified elastic pool already exists in the specified server. Proporcione un nuevo nombre de grupo elástico.
40859 16 Elastic pool does not support service tier '%ls'. Specified service tier is not supported for elastic pool provisioning. Especifique la versión correcta o deje el nivel de servicio en blanco para usar el nivel de servicio predeterminado.
40860 16 Elastic pool '%ls' and service objective '%ls' combination is invalid. Elastic pool and service tier can be specified together only if resource type is specified as 'ElasticPool'. Especifique la combinación correcta de grupo elástico y nivel de servicio.
40861 16 The database edition '%.*ls' cannot be different than the elastic pool service tier which is '%.*ls'. The database edition is different than the elastic pool service tier. No especifique una edición de la base de datos distinta del nivel de servicio del grupo elástico. No es necesario especificar la versión de la base de datos.
40862 16 Elastic pool name must be specified if the elastic pool service objective is specified. Elastic pool service objective does not uniquely identify an elastic pool. Especifique el nombre del grupo elástico si usa el objetivo del servicio de grupo elástico.
40864 16 The DTUs for the elastic pool must be at least (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool below the minimum limit. Vuelva a intentar establecer el número de DTU para el grupo elástico al menos en el límite mínimo.
40865 16 The DTUs for the elastic pool cannot exceed (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool above the maximum limit. Vuelva a intentar establecer el número de DTU para el grupo elástico en un valor inferior al límite máximo.
40867 16 The DTU max per database must be at least (%d) for service tier '%.*ls'. Attempting to set the DTU max per database below the supported limit. Considere la posibilidad de utilizar el nivel de servicio del grupo elástico que admita la configuración deseada.
40868 16 The DTU max per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU max per database beyond the supported limit. Considere la posibilidad de utilizar el nivel de servicio del grupo elástico que admita la configuración deseada.
40870 16 The DTU min per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU min per database beyond the supported limit. Considere la posibilidad de utilizar el nivel de servicio del grupo elástico que admita la configuración deseada.
40873 16 The number of databases (%d) and DTU min per database (%d) cannot exceed the DTUs of the elastic pool (%d). Attempting to specify DTU min for databases in the elastic pool that exceeds the DTUs of the elastic pool. Considere la posibilidad de aumentar el número de DTU del grupo elástico, reduzca el número mínimo de DTU por base de datos, o bien reduzca el número de bases de datos del grupo elástico.
40877 16 An elastic pool cannot be deleted unless it does not contain any databases. The elastic pool contains one or more databases and therefore cannot be deleted. Quite las bases de datos del grupo elástico para poder eliminarlo.
40881 16 The elastic pool '%.*ls' has reached its database count limit. The database count limit for the elastic pool cannot exceed (%d) for an elastic pool with (%d) DTUs. Attempting to create or add database to elastic pool when the database count limit of the elastic pool has been reached. Considere la posibilidad de incrementar el número de DTU del grupo elástico si es posible para aumentar el límite de bases de datos, o bien quite bases de datos del grupo elástico.
40889 16 The DTUs or storage limit for the elastic pool '%.*ls' cannot be decreased since that would not provide sufficient storage space for its databases. Attempting to decrease the storage limit of the elastic pool below its storage usage. Considere la posibilidad de reducir el uso de almacenamiento de bases de datos individuales del grupo elástico, o bien quite bases de datos del grupo para reducir su número de DTU o el límite de almacenamiento.
40891 16 The DTU min per database (%d) cannot exceed the DTU max per database (%d). Attempting to set the DTU min per database higher than the DTU max per database. Asegúrese de que el número mínimo de DTU por base de datos no supere el número máximo de DTU por base de datos.
TBD 16 The storage size for an individual database in an elastic pool cannot exceed the max size allowed by '%.*ls' service tier elastic pool. The max size for the database exceeds the max size allowed by the elastic pool service tier. Establezca el tamaño máximo de la base de datos por debajo de los límites de tamaño máximo permitidos por el nivel de servicio del grupo elástico.

No se puede abrir la base de datos maestra solicitada por el inicio de sesión. Error de inicio de sesión

Este problema se produce porque la cuenta no tiene permiso de acceso a la base de datos master. Sin embargo, SQL Server Management Studio (SSMS) intenta conectarse a la base de datos master.

Para resolver el problema, siga estos pasos:

  1. En la pantalla de inicio de sesión de SSMS, seleccione Opciones y, luego, Propiedades de la conexión.

  2. En el campo Conectar con base de datos, escriba el nombre de la base de datos predeterminada del usuario como la base de datos de inicio de sesión predeterminada y seleccione Conectar.

    Captura de pantalla del cuadro de diálogo Conectar en SSMS, mostrando la pestaña Propiedades de conexión.

Errores de solo lectura

Si intenta escribir en una base de datos de solo lectura, recibirá un error. En algunos escenarios, es posible que la causa del estado de solo lectura de la base de datos no esté clara inmediatamente.

Error 3906: No se pudo actualizar la base de datos "databaseName" porque es de solo lectura.

Al intentar modificar una base de datos de solo lectura, se producirá el siguiente error.

Msg 3906, Level 16, State 2, Line 1
Failed to update database "%d" because the database is read-only.

Hay varias explicaciones posibles de por qué una base de datos es de solo lectura.

Después de una conmutación por error manual, las aplicaciones todavía se conectan a la réplica antigua

En base de datos de Azure SQL, después de una conmutación por error a otra réplica, es posible que la aplicación se conecte a la réplica principal anterior debido a DNS. El enrutamiento de conexiones de grupo de conmutación por error se implementa mediante DNS.

Posible causa principal:

  1. Durante la conmutación por error, los puntos de conexión del grupo de conmutación por error se actualizan para que apunten a los nuevos servidores principales y secundarios adecuados cambiando el destino de la entrada DNS adecuada. De forma predeterminada, las entradas DNS se crean con un TTL de 30 segundos, lo que significa que los clientes DNS almacenan en caché estas entradas durante 30 segundos. Como resultado, las actualizaciones de los registros DNS no se propagan inmediatamente; las entradas estarán obsoletas hasta que todos los clientes y nodos intermedios hayan actualizado sus memorias caché. Por lo tanto, puede tardar entre 0 y aproximadamente 10 minutos (dependiendo de la topología de red) para que los inicios de sesión se enruten a los puntos de conexión del grupo de conmutación por error a sus nuevos destinos después de una conmutación por error. El vaciado de cachés DNS podría o no ayudar al problema, ya que los nodos de red intermedios que responden a las solicitudes DNS también almacenan en caché los resultados de DNS durante un tiempo.

    La solución alternativa recomendada para este problema es simplemente esperar hasta que las entradas DNS se actualicen en el cliente. Actualmente, esta solución alternativa provocaría que el problema se resuelva dentro de 10 minutos.

  2. Algunas bibliotecas de cliente SQL usan una característica denominada "agrupación de conexiones" que reutiliza las conexiones al mismo origen de datos en lugar de cerrarlas y volver a abrirlas siempre que se necesite una nueva conexión de base de datos. En particular, la agrupación de conexiones está activada en ADO.NET de manera predeterminada. Cuando se combina con el problema descrito en 1), la agrupación de conexiones puede provocar que las conexiones recién abiertas reutilicen una conexión a la base de datos antigua, lo que impide que la aplicación se conecte a la nueva base de datos principal indefinidamente.

Soluciones:

Hay tres posibles soluciones alternativas a este problema de DNS después de una conmutación por error de grupo de conmutación por error:

  1. Modifique la aplicación para llamar a SQLConnection.ClearAllPools o SQLConnection.ClearPool(conn) cada vez que se encuentre un error de "solo lectura".
  2. En la aplicación cadena de conexión, especifique Pooling=False para deshabilitar la agrupación de conexiones. Esto se debe probar, ya que podría afectar significativamente al rendimiento si la aplicación se abre y cierra las conexiones con frecuencia.
  3. Otra opción para evitar los retrasos de replicación o almacenamiento en caché de DNS es conectarse directamente mediante el nombre del servidor lógico de base de datos de Azure SQL (del servidor secundario original, ahora el nuevo principal) para un período de tiempo después de que se encuentre 3906.

Es posible que esté conectado a una réplica de solo lectura

Tanto para Azure SQL Database como para Azure SQL Managed Instance, es posible que esté conectado a una base de datos en una réplica de solo lectura. En este caso, la consulta siguiente que usa la función DATABASEPROPERTYEX() devolverá READ_ONLY:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');
GO

Si va a conectarse mediante SQL Server Management Studio, compruebe si ha especificado ApplicationIntent=ReadOnly en la pestaña Parámetros de conexión adicionales en las opciones de conexión.

Si la conexión procede de una aplicación o un cliente que usa una cadena de conexión, valide si la cadena de conexión ha especificado ApplicationIntent=ReadOnly. Obtenga más información en Conexión a una réplica de solo lectura.

La base de datos se puede establecer en solo lectura

Si usa base de datos de Azure SQL, es posible que la propia base de datos se haya establecido en solo lectura. Puede comprobar el estado de la base de datos con la siguiente consulta:

SELECT name, is_read_only
FROM sys.databases
WHERE database_id = DB_ID();

Puede modificar el estado de solo lectura de una base de datos en Azure SQL Database mediante ALTER DATABASE Transact-SQL. Actualmente no se puede establecer una base de datos de una instancia administrada en solo lectura.

Confirmación de si un error se debe a un problema de conectividad

Para confirmar si un error se debe a un problema de conectividad, revise el seguimiento de la pila de los marcos que muestran llamadas para abrir una conexión como las siguientes (observe la referencia a la clase SqlConnection):

System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at AzureConnectionTest.Program.Main(String[] args)
ClientConnectionId:<Client connection ID>

Cuando se produce la excepción por problemas de consulta, observará una pila de llamadas similar a la siguiente (observe la referencia a la clase SqlCommand). En esta situación, optimice las consultas .

  at System.Data.SqlClient.SqlCommand.ExecuteReader()
  at AzureConnectionTest.Program.Main(String[] args)
  ClientConnectionId:<Client ID>

Para más información sobre cómo ajustar el rendimiento, consulte los siguientes recursos: