Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 | Auf die Datenbank '%.*ls' kann nicht zugegriffen werden, weil das für Hochverfügbarkeit erforderliche Quorum von Knoten fehlt. Versuchen Sie es später erneut. |
Symptoms
Wenn Sie versuchen, einer AlwaysOn-Verfügbarkeitsgruppe eine Datenbank hinzuzufügen oder Lese-/Schreibvorgänge für das primäre Replikat auszuführen, erhalten Sie möglicherweise den folgenden SQL Server-Fehler 988:
Unable to access database '<DB Name>' because it lacks a quorum of nodes for high availability. (Microsoft SQL Server, Error: 988)
Dieser Fehler gibt an, dass auf die Datenbank nicht zugegriffen oder hinzugefügt werden kann, da die erforderliche Anzahl von synchronisierten sekundären Replikaten nicht verfügbar ist, um die Transaktion zu übernehmen.
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. Wenn die erforderliche Anzahl von Replikaten nicht online, verbunden und synchronisiert ist, treten möglicherweise die folgenden Probleme auf, die zu Blockierungs- oder Fehlerszenarien führen, die Fehler 988 auslösen.
- Das primäre Replikat kann keine Commits abschließen.
- Eine hinzugefügte Datenbank kann den Verknüpfungsprozess nicht abschließen, da secondaries noch nicht teilnehmen.
Scenarios
Dieser Fehler kann in den folgenden Szenarien auftreten:
Szenario 1: Hinzufügen einer neuen Datenbank
Wenn der Verfügbarkeitsgruppe eine neue Datenbank hinzugefügt wird, sind Secondaries noch nicht Teil der Gruppe und können den Commit nicht bestätigen, was zu einer Blockierungsbedingung führt.
Szenario 2: Laufzeit-Commitfehler
Wenn der konfigurierte Wert REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT größer als die Anzahl der verfügbaren synchronen synchronen Secondärdateien ist, kann der primäre Vorgang nicht mit Commits fortfahren.
Workaround
Um dieses Problem zu umgehen, verwenden Sie eine der folgenden Optionen:
Option 1: Anpassen der REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT Einstellung
Durch das Verringern des Werts kann 0 der primäre Commit ausgeführt werden, ohne auf synchrone Secondärdateien zu warten.
Warning
Diese Option verbessert die Verfügbarkeit, erhöht aber das Risiko eines Datenverlusts in Failoverszenarien.
Verwenden von SQL Server Management Studio (SSMS)
- Navigieren Sie zu dem Namen der Verfügbarkeitsgruppe in SSMS.
- Right-click the name and select Properties.
- Legen Sie den WERT "REQUIRED SYNCHRONIZED SECONDARIES TO COMMIT "
0auf oder einen entsprechenden Wert fest.
Use T-SQL
Führen Sie die folgende Abfrage aus:
ALTER AVAILABILITY GROUP [AGNAME] SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0);
Option 2: Vor dem Seeden der sekundären Replikate (zum Hinzufügen von Datenbanken)
Stellen Sie sicher, dass Secondaries bereit sind, bevor Sie eine Datenbank hinzufügen. Then, use automatic seeding, or manually restore the database on each secondary by using the Join only option.
Troubleshooting
Führen Sie die folgenden Schritte aus, um dieses Problem zu diagnostizieren und zu beheben:
Schritt 1: Bestätigen der einstellung REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
Um zu überprüfen, ob die REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT Einstellung für Ihre Verfügbarkeitsgruppe (AG) aktiviert ist, verwenden Sie SSMS oder T-SQL. Wenn der Wert oder höher ist 1 , fahren Sie mit Schritt 2 fort: Überprüfen Sie den Status synchroner sekundärer Replikate.
Use SSMS
- Navigieren Sie zu dem Namen der Verfügbarkeitsgruppe in SSMS.
- Right-click the name and select Properties.
- Überprüfen Sie die ERFORDERLICHEN SYNCHRONISIERTEN SECONDARIES, UM DEN COMMIT-Wert zu übernehmen .
Use T-SQL
Führen Sie die folgende Abfrage für das primäre Replikat aus:
SELECT name AS Availability_group_name,
required_synchronized_secondaries_to_commit,
*
FROM sys.availability_groups;
Note
Diese Abfrage kann auch dann ausgeführt werden, wenn der Fehler 988 auftritt.
Schritt 2: Überprüfen des Status synchroner sekundärer Replikate
Um zu überprüfen, ob die Mindestanzahl synchroner sekundärer Replikate verbunden, synchronisiert und fehlerfrei ist, verwenden Sie SSMS oder T-SQL.
Use SSMS
- Öffnen Sie das Verfügbarkeitsgruppendashboard im primären Replikat.
- Überprüfen Sie den Status der sekundären Replikate.
Use T-SQL
Führen Sie die folgende Abfrage aus:
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;
Stellen Sie sicher, dass die Anzahl der Replikate und HEALTHY der Anzahl der CONNECTEDSYNCHRONIZEDReplikate der REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT Einstellung entspricht.
Die folgende erweiterte Ereignissitzung erfasst Commitrichtlinieneinstellungen und Synchronisierungsstatusänderungen, um zu diagnostizieren, warum erforderliche synchronisierte Secondaries Transaktions-Commits in SQL Server AlwaysOn-Verfügbarkeitsgruppen verhindern.
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.