Compartir a través de


MSSQLSERVER_988

Applies to:SQL Server

Details

Attribute Value
Product Name SQL Server
Event ID 988
Event Source MSSQLSERVER
Component SQLEngine
Symbolic Name DB_HADRON_DATABASE_NO_QUORUM
Message Text No se puede acceder a la base de datos "%.*ls" porque carece de un quórum de nodos para tener una elevada disponibilidad. Reintente la operación.

Symptoms

Al intentar agregar una base de datos a un grupo de disponibilidad AlwaysOn o realizar operaciones de lectura y escritura en la réplica principal, es posible que reciba el siguiente error 988 de SQL Server:

Unable to access database '<DB Name>' because it lacks a quorum of nodes for high availability. (Microsoft SQL Server, Error: 988)

Este error indica que no se puede tener acceso a la base de datos ni agregarse porque el número necesario de réplicas secundarias sincronizadas no está disponible para confirmar la transacción.

Cause

The REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT setting enforces that the primary replica must wait for a specified number of synchronous secondary replicas to harden each transaction before committing. Si el número necesario de réplicas no está en línea, conectado y sincronizado, es posible que encuentre los siguientes problemas, lo que provoca escenarios de bloqueo o error que desencadenan el error 988.

  • La réplica principal no puede completar confirmaciones.
  • Una base de datos que se va a agregar no puede completar el proceso de combinación, ya que los secundarios aún no participan.

Scenarios

Es posible que encuentre este error en los escenarios siguientes:

Escenario 1: Agregar una nueva base de datos

Cuando se agrega una nueva base de datos al grupo de disponibilidad, los secundarios aún no forman parte del grupo y no pueden confirmar la confirmación, lo que provoca una condición de bloqueo.

Escenario 2: Errores de confirmación en tiempo de ejecución

Cuando el valor configurado de REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT es mayor que el número de secundarias sincrónicas disponibles, la réplica principal no puede continuar con confirmaciones.

Workaround

Para solucionar este problema, use una de las siguientes opciones:

Opción 1: Ajustar la configuración de REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

Reducir el valor para 0 permitir que la principal se confirme sin esperar a secundarias sincrónicas.

Warning

Esta opción mejora la disponibilidad, pero aumenta el riesgo de pérdida de datos en escenarios de conmutación por error.

Utilice SQL Server Management Studio (SSMS)

  1. Vaya al nombre del grupo de disponibilidad en SSMS.
  2. Right-click the name and select Properties.
  3. Establezca el valor REQUIRED SYNCHRONIZED SECONDARIES TO COMMIT en 0 o en un valor adecuado.

Use T-SQL

Ejecute la siguiente consulta:

ALTER AVAILABILITY GROUP [AGNAME] SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0);

Opción 2: Inicialización previa de las réplicas secundarias (para agregar bases de datos)

Asegúrese de que los secundarios estén listos antes de agregar una base de datos. Then, use automatic seeding, or manually restore the database on each secondary by using the Join only option.

Troubleshooting

Para diagnosticar y resolver este problema, siga estos pasos:

Paso 1: Confirmar la configuración de REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

Para comprobar si la configuración está habilitada para el REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT grupo de disponibilidad (AG), use SSMS o T-SQL. Si el valor es 1 o superior, vaya al Paso 2: Comprobar el estado de las réplicas secundarias sincrónicas.

Use SSMS

  1. Vaya al nombre del grupo de disponibilidad en SSMS.
  2. Right-click the name and select Properties.
  3. Compruebe el valor REQUIRED SYNCHRONIZED SECONDARIES TO COMMIT (REQUIRED SYNCHRONIZED SECONDARIES TO COMMIT ).

Use T-SQL

Ejecute la consulta siguiente en la réplica principal:

SELECT name AS Availability_group_name,
       required_synchronized_secondaries_to_commit,
       *
FROM sys.availability_groups;

Note

Esta consulta se puede ejecutar incluso si se inicia el error 988.

Paso 2: Comprobar el estado de las réplicas secundarias sincrónicas

Para comprobar si el número mínimo de réplicas secundarias sincrónicas está conectado, sincronizado y correcto, use SSMS o T-SQL.

Use SSMS

  1. Abra el panel grupos de disponibilidad en la réplica principal.
  2. Revise el estado de las réplicas secundarias.

Use T-SQL

Ejecute la siguiente consulta:

SELECT ag.name AS Availability_group_name,
       drcs.database_name,
       ar.replica_server_name,
       ars.role_desc,
       ars.connected_state_desc,
       ars.synchronization_health_desc,
       ars.last_connect_error_description,
       ars.last_connect_error_number,
       ars.last_connect_error_timestamp,
       ar.endpoint_url
FROM sys.dm_hadr_availability_replica_states AS ars
     INNER JOIN sys.availability_replicas AS ar
         ON ars.replica_id = ar.replica_id
     INNER JOIN sys.availability_groups AS ag
         ON ar.group_id = ag.group_id
     INNER JOIN sys.dm_hadr_database_replica_cluster_states AS drcs
         ON ar.replica_id = drcs.replica_id;

Asegúrese de que el número de CONNECTEDréplicas , SYNCHRONIZEDy HEALTHY coincide con la REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT configuración.

La siguiente sesión de eventos extendidos captura la configuración de directiva de confirmación y los cambios de estado de sincronización para diagnosticar por qué los secundarios sincronizados necesarios impiden las confirmaciones de transacciones en grupos de disponibilidad AlwaysOn de SQL Server.

CREATE EVENT SESSION [ag_state_change] ON SERVER
ADD EVENT sqlserver.alwayson_ddl_executed
    (ACTION (sqlos.system_thread_id, sqlserver.session_id, sqlserver.sql_text)),
ADD EVENT sqlserver.hadr_db_commit_mgr_harden
    (ACTION (sqlos.system_thread_id, sqlserver.session_id, sqlserver.sql_text)),
ADD EVENT sqlserver.hadr_db_commit_mgr_set_policy
    (ACTION (sqlos.system_thread_id, sqlserver.session_id, sqlserver.sql_text)),
ADD EVENT sqlserver.hadr_db_commit_mgr_update_harden
    (ACTION (sqlos.system_thread_id, sqlserver.session_id, sqlserver.sql_text)),
ADD EVENT sqlserver.hadr_db_partner_set_policy
    (ACTION (sqlos.system_thread_id, sqlserver.session_id, sqlserver.sql_text)),
ADD EVENT sqlserver.hadr_db_partner_set_sync_state
    (ACTION (sqlos.system_thread_id, sqlserver.session_id, sqlserver.sql_text))
ADD TARGET package0.event_file
    (SET filename = N'ag_state_change')
WITH
(
        MAX_MEMORY = 4096 KB,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 30 SECONDS,
        MAX_EVENT_SIZE = 0 KB,
        MEMORY_PARTITION_MODE = NONE,
        TRACK_CAUSALITY = OFF,
        STARTUP_STATE = OFF
);
GO

The hadr_db_commit_mgr_update_harden event could be used to identify the issue. When the issue occurs, the MinSyncCommitFailure status means there aren't enough synchronization secondaries to meet the configured minimum synchronization count.