Udostępnij za pomocą


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 Nie można uzyskać dostępu do bazy danych "%.*ls", ponieważ brakuje kworum węzłów w celu zapewnienia wysokiej dostępności. Spróbuj ponownie wykonać operację później.

Symptoms

Podczas próby dodania bazy danych do zawsze włączonej grupy dostępności lub wykonania operacji odczytu/zapisu w repliki podstawowej może zostać wyświetlony następujący błąd programu SQL Server 988:

Unable to access database '<DB Name>' because it lacks a quorum of nodes for high availability. (Microsoft SQL Server, Error: 988)

Ten błąd wskazuje, że nie można uzyskać dostępu do bazy danych ani dodać jej, ponieważ wymagana liczba zsynchronizowanych replik pomocniczych nie jest dostępna do zatwierdzenia transakcji.

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. Jeśli wymagana liczba replik nie jest w trybie online, połączona i zsynchronizowana, mogą wystąpić następujące problemy, co prowadzi do scenariuszy blokowania lub awarii, które wyzwalają błąd 988.

  • Replika podstawowa nie może ukończyć zatwierdzeń.
  • Dodawana baza danych nie może ukończyć procesu sprzężenia, ponieważ moduły pomocnicze nie uczestniczą jeszcze w tym procesie.

Scenarios

Ten błąd może wystąpić w następujących scenariuszach:

Scenariusz 1. Dodawanie nowej bazy danych

Po dodaniu nowej bazy danych do grupy dostępności pomocnicze nie są jeszcze częścią grupy i nie mogą potwierdzić zatwierdzenia, powodując warunek blokowania.

Scenariusz 2. Błędy zatwierdzania środowiska uruchomieniowego

Jeśli skonfigurowana wartość parametru REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT jest większa niż liczba dostępnych synchronicznych serwerów pomocniczych w dobrej kondycji, podstawowy nie może kontynuować zatwierdzania.

Workaround

Aby obejść ten problem, użyj jednej z następujących opcji:

Opcja 1. Dostosowywanie ustawienia REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

Obniżenie wartości 0 umożliwia zatwierdzanie podstawowego bez oczekiwania na synchroniczne sekundy.

Warning

Ta opcja zwiększa dostępność, ale zwiększa ryzyko utraty danych w scenariuszach trybu failover.

Korzystanie z programu SQL Server Management Studio (SSMS)

  1. Przejdź do nazwy grupy dostępności w programie SSMS.
  2. Right-click the name and select Properties.
  3. Ustaw wartość REQUIRED SYNCD SECONDARIES TO COMMIT (WYMAGANE ZSYNCHRONIZOWANE DANE POMOCNICZE) na 0 wartość LUB odpowiednią wartość.

Use T-SQL

Uruchom następujące zapytanie:

ALTER AVAILABILITY GROUP [AGNAME] SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0);

Opcja 2. Wstępne rozmieszczanie replik pomocniczych (w przypadku dodawania baz danych)

Przed dodaniem bazy danych upewnij się, że pliki drugie są gotowe. Then, use automatic seeding, or manually restore the database on each secondary by using the Join only option.

Troubleshooting

Aby zdiagnozować i rozwiązać ten problem, wykonaj następujące kroki:

Krok 1. Potwierdzenie ustawienia REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

Aby sprawdzić, czy REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT ustawienie jest włączone dla grupy dostępności, użyj programu SSMS lub języka T-SQL. Jeśli wartość jest 1 lub wyższa, przejdź do kroku 2: Sprawdź stan synchronicznych replik pomocniczych.

Use SSMS

  1. Przejdź do nazwy grupy dostępności w programie SSMS.
  2. Right-click the name and select Properties.
  3. Sprawdź wartość WYMAGANE ZSYNCHRONIZOWANE SEKUNDY DO ZATWIERDZENIA .

Use T-SQL

Uruchom następujące zapytanie w repliki podstawowej:

SELECT name AS Availability_group_name,
       required_synchronized_secondaries_to_commit,
       *
FROM sys.availability_groups;

Note

To zapytanie można wykonać nawet wtedy, gdy wystąpi błąd 988.

Krok 2. Weryfikowanie stanu synchronicznych replik pomocniczych

Aby sprawdzić, czy minimalna liczba synchronicznych replik pomocniczych jest połączona, zsynchronizowana i w dobrej kondycji, użyj programu SSMS lub języka T-SQL.

Use SSMS

  1. Otwórz pulpit nawigacyjny grup dostępności w repliki podstawowej.
  2. Przejrzyj stan replik pomocniczych.

Use T-SQL

Uruchom następujące zapytanie:

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;

Upewnij się, że liczba CONNECTEDreplik , SYNCHRONIZEDi HEALTHY jest zgodna z ustawieniem REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT .

Następująca rozszerzona sesja zdarzeń przechwytuje ustawienia zasad zatwierdzania i zmiany stanu synchronizacji, aby zdiagnozować, dlaczego wymagane zsynchronizowane sekundy uniemożliwiają zatwierdzenia transakcji w zawsze włączonych grupach dostępności programu SQL Server.

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.