Поделиться через


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 Невозможно получить доступ к базе данных "%.*ls", поскольку у нее нет кворума узлов для высокого уровня доступности. Повторите операцию позднее.

Symptoms

При попытке добавить базу данных в группу доступности AlwaysOn или выполнить операции чтения и записи в первичной реплике может появиться следующая ошибка 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

Этот параметр повышает доступность, но повышает риск потери данных в сценариях отработки отказа.

Использование SQL Server Management Studio (SSMS)

  1. Перейдите к имени группы доступности в SSMS.
  2. Right-click the name and select Properties.
  3. Задайте для параметра REQUIRED SYNCHRONIZED SECONDARIES значение 0 COMMIT или соответствующее значение.

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

Чтобы проверить, включен ли REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT параметр для группы доступности (AG), используйте SSMS или T-SQL. Если значение равно 1 или выше, перейдите к шагу 2. Проверьте состояние синхронных вторичных реплик.

Use SSMS

  1. Перейдите к имени группы доступности в SSMS.
  2. Right-click the name and select Properties.
  3. Проверьте значение ОБЯЗАТЕЛЬНЫХ СИНХРОНИЗИРОВАННЫХ ВТОРИЧНЫХ ФАЙЛОВ ДЛЯ ФИКСАЦИИ .

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

  1. Откройте панель мониторинга групп доступности на первичной реплике.
  2. Просмотрите состояние вторичных реплик.

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;

Убедитесь, что количество CONNECTEDSYNCHRONIZEDреплик и HEALTHY реплик соответствует параметруREQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT.

Следующий расширенный сеанс событий фиксирует параметры политики фиксации и изменения состояния синхронизации для диагностики того, почему необходимые синхронизированные вторичные файлы предотвращают фиксацию транзакций в группах доступности AlwaysOn 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.