共用方式為


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

當您嘗試將資料庫新增至 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)

  1. 流覽至 SSMS 中的可用性組名。
  2. Right-click the name and select Properties.
  3. 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

  1. 流覽至 SSMS 中的可用性組名。
  2. Right-click the name and select Properties.
  3. 檢查 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

  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;

請確定、 SYNCHRONIZEDHEALTHY 複本的數目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.