Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 | Det går inte att komma åt databasen%.*ls eftersom den saknar ett kvorum med noder för hög tillgänglighet. Försök operationen igen senare. |
Symptoms
När du försöker lägga till en databas i en AlwaysOn-tillgänglighetsgrupp eller utföra läs-/skrivåtgärder på den primära repliken kan du få följande SQL Server-fel 988:
Unable to access database '<DB Name>' because it lacks a quorum of nodes for high availability. (Microsoft SQL Server, Error: 988)
Det här felet anger att databasen inte kan nås eller läggas till eftersom det nödvändiga antalet synkroniserade sekundära repliker inte är tillgängligt för att genomföra transaktionen.
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. Om det nödvändiga antalet repliker inte är online, anslutna och synkroniserade kan följande problem uppstå, vilket leder till blockerings- eller felscenarier som utlöser fel 988.
- Den primära repliken kan inte slutföra incheckningar.
- En databas som läggs till kan inte slutföra anslutningsprocessen, eftersom sekundärfiler ännu inte deltar.
Scenarios
Du kan stöta på det här felet i följande scenarier:
Scenario 1: Lägga till en ny databas
När en ny databas läggs till i tillgänglighetsgruppen är sekundärfiler ännu inte en del av gruppen och kan inte bekräfta incheckningen, vilket orsakar ett blockeringsvillkor.
Scenario 2: Körningsfel vid incheckning
När det konfigurerade värdet REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT för är större än antalet tillgängliga felfria synkrona sekundärfiler kan den primära inte fortsätta med incheckningar.
Workaround
Du kan undvika det här problemet genom att använda något av följande alternativ:
Alternativ 1: Justera inställningen för REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
Om du sänker värdet till 0 kan den primära checka in utan att vänta på synkrona sekundärfiler.
Warning
Det här alternativet förbättrar tillgängligheten men ökar risken för dataförlust i redundansscenarier.
Använda SQL Server Management Studio (SSMS)
- Gå till namnet på tillgänglighetsgruppen i SSMS.
- Right-click the name and select Properties.
- Ange värdet REQUIRED SYNCHRONIZED SECONDARIES TO COMMIT till
0eller ett lämpligt värde.
Use T-SQL
Kör följande fråga:
ALTER AVAILABILITY GROUP [AGNAME] SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0);
Alternativ 2: Förutsäd de sekundära replikerna (för att lägga till databaser)
Kontrollera att sekundärfilerna är klara innan du lägger till en databas. Then, use automatic seeding, or manually restore the database on each secondary by using the Join only option.
Troubleshooting
Följ dessa steg för att diagnostisera och lösa problemet:
Steg 1: Bekräfta inställningen för REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
Om du vill kontrollera om REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT inställningen är aktiverad för din tillgänglighetsgrupp (AG) använder du SSMS eller T-SQL. Om värdet är 1 eller högre fortsätter du till Steg 2: Kontrollera tillståndet för synkrona sekundära repliker.
Use SSMS
- Gå till namnet på tillgänglighetsgruppen i SSMS.
- Right-click the name and select Properties.
- Kontrollera värdet NÖDVÄNDIGA SYNKRONISERADE SEKUNDÄRFILER FÖR ATT CHECKA IN .
Use T-SQL
Kör följande fråga på den primära repliken:
SELECT name AS Availability_group_name,
required_synchronized_secondaries_to_commit,
*
FROM sys.availability_groups;
Note
Den här frågan kan köras även om 988-felet börjar inträffa.
Steg 2: Verifiera tillståndet för synkrona sekundära repliker
Om du vill kontrollera om det minsta antalet synkrona sekundära repliker är anslutna, synkroniserade och felfria använder du SSMS eller T-SQL.
Use SSMS
- Öppna instrumentpanelen för tillgänglighetsgrupper på den primära repliken.
- Granska tillståndet för sekundära repliker.
Use T-SQL
Kör följande fråga:
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;
Kontrollera att antalet CONNECTED, SYNCHRONIZEDoch HEALTHY repliker matchar REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT inställningen.
Följande utökade händelsesession samlar in inställningar för incheckningsprinciper och synkroniseringstillståndsändringar för att diagnostisera varför nödvändiga synkroniserade sekundärfiler förhindrar transaktionsincheckningar i SQL Server AlwaysOn-tillgänglighetsgrupper.
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.