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.
-
必要な 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.
- COMMIT 値に 必要な SYNCHRONIZED セカンダリを 確認します。
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;
CONNECTED、SYNCHRONIZED、および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.