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
當您嘗試將資料庫新增至 Always On 可用性群組或在主要複本上執行讀取/寫入作業時,您可能會收到下列 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.
- 將 REQUIRED SYNCHRONIZED SECONDARIES TO 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設定
若要確認可用性群組 (AG) 的設定是否 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 已啟用,請使用 SSMS 或 T-SQL。 如果值是 1 或更高,請繼續進行 步驟 2:確認同步次要複本的狀態。
Use SSMS
- 流覽至 SSMS 中的可用性組名。
- Right-click the name and select Properties.
- 檢查 REQUIRED SYNCHRONIZED SECONDARIES TO COMMIT 值。
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;
請確定、 SYNCHRONIZED和 HEALTHY 複本的數目CONNECTED符合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.