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
이 옵션은 가용성을 향상하지만 장애 조치 시나리오에서 데이터 손실의 위험을 증가시킵니다.
SSMS(SQL Server Management Studio) 사용
- SSMS에서 가용성 그룹 이름으로 이동합니다.
- Right-click the name and select Properties.
-
필요한 SYNCHRONIZED SECONDARIES를 커밋 값 또는 적절한 값으로
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.
- 커밋 값에 필요한 동기화된 보조 데이터베이스를 확인합니다.
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설정과 HEALTHY 일치하는 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 지 확인SYNCHRONIZED합니다.
다음 확장 이벤트 세션은 커밋 정책 설정 및 동기화 상태 변경 내용을 캡처하여 필요한 동기화된 보조 데이터베이스가 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.