Freigeben über


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 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)

  1. Navigieren Sie zu dem Namen der Verfügbarkeitsgruppe in SSMS.
  2. Right-click the name and select Properties.
  3. Legen Sie den WERT "REQUIRED SYNCHRONIZED SECONDARIES TO COMMIT " 0 auf 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

  1. Navigieren Sie zu dem Namen der Verfügbarkeitsgruppe in SSMS.
  2. Right-click the name and select Properties.
  3. Ü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

  1. Öffnen Sie das Verfügbarkeitsgruppendashboard im primären Replikat.
  2. Ü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.