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 无法访问数据库 '%.*ls',因为它缺少用于实现高可用性的节点仲裁。 请稍后再试此操作。

Symptoms

尝试将数据库添加到 AlwaysOn 可用性组或对主副本执行读/写作时,可能会收到以下 SQL Server 错误 988:

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

此错误表示无法访问或添加数据库,因为无法提交事务所需的同步次要副本数。

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. 如果所需的副本数未联机、连接和同步,可能会遇到以下问题,从而导致触发错误 988 的阻止或失败方案。

  • 主副本无法完成提交。
  • 正在添加的数据库无法完成联接过程,因为辅助数据库尚未参与。

Scenarios

在以下方案中可能会遇到此错误:

方案 1:添加新数据库

将新数据库添加到可用性组时,辅助数据库尚未成为该组的一部分,并且无法确认提交,从而导致阻塞条件。

方案 2:运行时提交失败

当配置的值为 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 大于可用正常同步辅助数据库的数量时,主数据库无法继续提交。

Workaround

若要解决此问题,请使用下列选项之一:

选项 1:调整REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT设置

降低该值以 0 允许主数据库提交,而无需等待同步辅助数据库。

Warning

此选项可提高可用性,但会增加故障转移方案中数据丢失的风险。

使用 SQL Server Management Studio (SSMS)

  1. 导航到 SSMS 中的可用性组名称。
  2. Right-click the name and select Properties.
  3. 所需的 SYNCHRONIZED 辅助数据库设置为 COMMIT0 或相应的值。

Use T-SQL

运行以下查询:

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

选项 2:预种子设定次要副本(用于添加数据库)

在添加数据库之前,请确保辅助数据库已准备就绪。 Then, use automatic seeding, or manually restore the database on each secondary by using the Join only option.

Troubleshooting

若要诊断并解决此问题,请执行以下步骤:

步骤 1:确认REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT设置

若要验证是否已 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 为可用性组(AG)启用设置,请使用 SSMS 或 T-SQL。 如果该值 1 较高,请转到 步骤 2:验证同步次要副本的状态

Use SSMS

  1. 导航到 SSMS 中的可用性组名称。
  2. Right-click the name and select Properties.
  3. 检查 所需的已同步辅助数据库以提交 值。

Use T-SQL

对主要副本运行以下查询:

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

Note

即使发生 988 错误,也可以执行此查询。

步骤 2:验证同步次要副本的状态

若要检查是否已连接、同步和正常运行的最小同步次要副本数,请使用 SSMS 或 T-SQL。

Use SSMS

  1. 在主要副本上打开 可用性组仪表板
  2. 查看次要副本的状态。

Use T-SQL

运行以下查询:

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;

请确保副本的数量CONNECTEDSYNCHRONIZEDHEALTHY副本与设置匹配REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

以下扩展事件会话捕获提交策略设置和同步状态更改,以诊断为何需要同步的辅助数据库阻止 SQL Server Always On 可用性组中的事务提交。

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.