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)
- 导航到 SSMS 中的可用性组名称。
- Right-click the name and select Properties.
- 将 所需的 SYNCHRONIZED 辅助数据库设置为 COMMIT 值
0或相应的值。
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
- 导航到 SSMS 中的可用性组名称。
- Right-click the name and select Properties.
- 检查 所需的已同步辅助数据库以提交 值。
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
- 在主要副本上打开 可用性组仪表板 。
- 查看次要副本的状态。
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;
请确保副本的数量CONNECTEDSYNCHRONIZED和HEALTHY副本与设置匹配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.