Устранение неполадок Always On баз данных доступности в состоянии ожидания восстановления или подозрительного состояния в SQL Server

В этой статье описываются ошибки и ограничения базы данных доступности в Microsoft SQL Server, которая находится в Recovery Pending состоянии или , Suspect а также способы восстановления базы данных до полной функциональности в группе доступности.

Исходная версия продукта: SQL Server 2012 г.
Исходный номер базы знаний: 2857849

Сводка

Предположим, что база данных доступности, определенная в группе доступности Always On, переходит Recovery Pending в состояние или Suspect в SQL Server. Если это происходит на первичном реплика группы доступности, это влияет на доступность базы данных. В этом случае вы не сможете получить доступ к базе данных через клиентские приложения. Кроме того, нельзя удалить или удалить базу данных из группы доступности.

Например, предположим, что SQL Server выполняется, а для базы данных доступности задано Recovery Pending состояние или Suspect . При запросе динамических административных представлений (DMV) на первичном реплика с помощью следующего скрипта SQL база данных может быть представлена NOT_HEALTHYSUSPECT в состоянии и RECOVERY_PENDING или в состоянии следующим образом:

SELECT
    dc.database_name,
    d.synchronization_health_desc,
    d.synchronization_state_desc,
    d.database_state_desc
FROM
    sys.dm_hadr_database_replica_states d
    JOIN sys.availability_databases_cluster dc ON d.group_database_id = dc.group_database_id
    AND d.is_local = 1
database_name          synchronization_health_desc     synchronization_state_desc   database_state_desc
-------------------- ------------------------------ ------------------------------ ---------------------
<DatabaseName>                         NOT_HEALTHY              NOT SYNCHRONIZING      RECOVERY_PENDING
(1 row(s) affected)

Снимок экрана: результат выполнения скрипта для проверка работоспособности базы данных и состояния синхронизации.

Кроме того, эта база данных может находиться в состоянии Не синхронизация/ Ожидание восстановления или Подозрительное в SQL Server Management Studio.

Снимок экрана: база данных находится в состоянии

Если база данных определена в группе доступности, ее невозможно удалить или восстановить. Поэтому необходимо выполнить определенные действия, чтобы восстановить базу данных и вернуть ее в рабочую среду.

Дополнительная информация

В следующем содержимом рассматриваются ошибки и ограничения базы данных доступности, которая находится в состоянии ожидания восстановления в различных ситуациях.

  • Состояние базы данных предотвращает восстановление базы данных

    Чтобы восстановить базу данных с параметром RECOVERY , попробуйте выполнить следующий скрипт SQL:

    RESTORE DATABASE <DatabaseName> WITH RECOVERY
    

    При выполнении этого скрипта появляется следующее сообщение об ошибке, так как база данных определена в группе доступности:

    Сообщение 3104, уровень 16, состояние 1, строка 1
    Функция RESTORE не может работать с database <DatabaseName> , так как она настроена для зеркального отображения базы данных или присоединена к группе доступности. Если вы планируете восстановить базу данных, используйте инструкцию ALTER DATABASE, чтобы удалить зеркальное отображение или удалить базу данных из группы доступности.

    Сообщение 3013, уровень 16, состояние 1, строка 1
    Восстановление базы данных происходит аномально.

  • Состояние базы данных предотвращает удаление базы данных

    Чтобы удалить базу данных, попробуйте выполнить следующий скрипт SQL:

    DROP DATABASE <DatabaseName>
    

    При выполнении этого скрипта появляется следующее сообщение об ошибке, так как база данных определена в группе доступности:

    Сообщение 3752, уровень 16, состояние 1, строка 1
    База данных <DatabaseName> в настоящее время присоединена к группе доступности. Перед удалением базы данных необходимо удалить ее из группы доступности.

  • Состояние базы данных предотвращает удаление базы данных из группы доступности

    Чтобы удалить базу данных из группы доступности, попробуйте выполнить следующий скрипт SQL:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    При попытке запустить этот скрипт появляется следующее сообщение об ошибке, так как база данных доступности принадлежит к основному реплика:

    Сообщение 35240, уровень 16, состояние 14, строка 1
    База данных <DatabaseName> не может быть присоединена к группе доступности AvailabilityGroupName> или отсоединена от нее<. Эта операция не поддерживается в основном реплика группы доступности.

    Из-за этого сообщения об ошибке может потребоваться выполнить отработку отказа базы данных. После отработки отказа базы данных реплика, которому принадлежит ожидающая восстановления база данных, находится в роли-получателе. В этом случае вы попытаетесь выполнить следующий скрипт SQL еще раз, чтобы удалить базу данных из группы доступности на вторичном реплика:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    Однако вы по-прежнему не можете удалить базу данных из группы доступности, и вы получите следующее сообщение об ошибке, так как база данных по-прежнему находится в состоянии ожидания восстановления:

    Сообщение 921, уровень 16, состояние 112, строка 1
    Database <DatabaseName> еще не восстановлен. Подождите и повторите попытку.

Разрешение, когда база данных находится в роли-получателе

Чтобы устранить эту проблему, выполните следующие общие действия.

  • Удалите из группы доступности реплика, в котором размещена поврежденная база данных, когда база данных находится в роли-получателе.
  • Устраните все проблемы, влияющие на систему и которые могли привести к сбою базы данных.
  • Восстановите реплика в группе доступности.

Чтобы выполнить эти действия, подключитесь к новой первичной реплика, а затем запустите ALTER AVAILABILITY GROUP скрипт SQL, чтобы удалить реплика, в котором размещена база данных доступности, на котором была выполнена сбойная база данных доступности. Для этого выполните указанные ниже действия.

При выполнении этих действий предполагается, что на реплика-источнике сначала размещается поврежденная база данных. Поэтому сначала необходимо выполнить отработку отказа, чтобы перевести реплика, в котором размещена поврежденная база данных, во вторичную роль.

  1. Подключитесь к серверу, на котором выполняется SQL Server и на котором размещается дополнительный реплика.

  2. Выполните следующий скрипт SQL:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
    
  3. Выполните следующий скрипт SQL, чтобы удалить реплика, в котором размещена поврежденная база данных, из группы доступности:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
    
  4. Устраните все проблемы на сервере, на котором выполняется SQL Server и которые могут привести к сбою базы данных.

  5. Добавьте реплика обратно в группу доступности.

Разрешение, когда основной реплика является единственным реплика в группе доступности

Если основная реплика размещает поврежденную базу данных и является единственным рабочим реплика в группе доступности, группа доступности должна быть удалена. После удаления группы доступности базу данных можно восстановить из резервной копии или применить другие усилия по аварийному восстановлению для восстановления баз данных и возобновления рабочей среды.

Чтобы удалить группу доступности, используйте следующий скрипт SQL:

DROP AVAILABILITY GROUP <AvailabilityGroupName>

На этом этапе можно попытаться восстановить проблемную базу данных. Или можно восстановить базу данных из последней известной хорошей резервной копии.

Решение при удалении группы доступности

При удалении группы доступности ресурс прослушивателя также удаляется и прерывает подключение приложения к базам данных доступности.

Чтобы свести к минимуму время простоя приложения, используйте один из следующих методов для поддержки подключения к приложению через прослушиватель и удаления группы доступности:

Метод 1. Связывание прослушивателя с новой группой доступности (ролью) в диспетчере отказоустойчивости кластеров

Этот метод позволяет поддерживать прослушиватель при удалении и повторном создании группы доступности.

  1. На экземпляре SQL Server, к которому существующий прослушиватель группы доступности направляет подключения, создайте пустую группу доступности. Чтобы упростить этот процесс, используйте команду Transact-SQL, чтобы создать группу доступности без дополнительных реплика или базы данных:

    USE master
    GO
    CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
        ENDPOINT_URL = 'tcp://sqlnode1:5022',
        AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
        FAILOVER_MODE = MANUAL
    )
    
  2. Запустите диспетчер отказоустойчивости кластеров, а затем выберите Роли в области слева. В области со списком ролей выберите исходную группу доступности.

  3. На нижней средней панели на вкладке Ресурсы щелкните правой кнопкой мыши ресурс группы доступности и выберите пункт Свойства. Перейдите на вкладку Зависимости , удалите зависимость прослушивателя и нажмите кнопку ОК.

    Снимок экрана: вкладка

  4. В разделе ресурсов щелкните прослушиватель правой кнопкой мыши, выберите Дополнительные действия, а затем выберите Назначить другой роли.

  5. В диалоговом окне Назначение источника роли выберите новую группу доступности и нажмите кнопку ОК.

    Снимок экрана: диалоговое окно

  6. В области Роли выберите новую группу доступности. На нижней средней панели на вкладке Ресурсы вы увидите новую группу доступности и ресурс прослушивателя. Щелкните правой кнопкой мыши новый ресурс группы доступности и выберите Пункт Свойства.

  7. Откройте вкладку Зависимости , выберите ресурс прослушивателя в раскрывающемся списке и нажмите кнопку ОК.

    Снимок экрана: вкладка

  8. В SQL Server Management Studio используйте обозреватель объектов для подключения к экземпляру SQL Server, на котором размещается основной реплика новой группы доступности. Выберите Always On Высокий уровень доступности, щелкните новую группу доступности, а затем выберите Прослушиватели группы доступности. Вы должны найти прослушиватель.

  9. Щелкните прослушиватель правой кнопкой мыши, выберите Свойства, введите соответствующий номер порта для прослушивателя и нажмите кнопку ОК.

    Снимок экрана: свойства прослушивателя группы доступности с конфигурацией прослушивателя.

Это гарантирует, что приложения, использующие прослушиватель, по-прежнему могут использовать его для подключения к экземпляру SQL Server, в котором размещаются рабочие базы данных без прерывания. Исходную группу доступности теперь можно полностью удалить и повторно создать. Кроме того, базы данных и реплики можно добавить в новую группу доступности.

При повторном создании исходной группы доступности следует переназначить прослушиватель обратно роли группы доступности, настроить зависимость между новым ресурсом группы доступности и прослушивателем, а затем переназначить порт прослушивателю. Для этого выполните следующие действия:

  1. Запустите диспетчер отказоустойчивости кластеров, а затем выберите Роли в области слева. В области со списком ролей щелкните новую группу доступности, в которую размещается прослушиватель.
  2. В нижней средней области на вкладке Ресурсы щелкните прослушивателя правой кнопкой мыши, выберите Дополнительные действия, а затем выберите Назначить другую роль. В диалоговом окне выберите повторно созданную группу доступности и нажмите кнопку ОК.
  3. В области Роли щелкните повторно созданную группу доступности. В нижней средней области на вкладке Ресурсы вы увидите повторно созданную группу доступности и ресурс прослушивателя. Щелкните правой кнопкой мыши повторно созданный ресурс группы доступности и выберите Пункт Свойства.
  4. Перейдите на вкладку Зависимости , выберите ресурс прослушивателя в раскрывающемся списке и нажмите кнопку ОК.
  5. В SQL Server Management Studio используйте обозреватель объектов для подключения к экземпляру SQL Server, на котором размещается основной реплика повторно созданной группы доступности. Выберите Always On Высокий уровень доступности, щелкните новую группу доступности, а затем выберите Прослушиватели группы доступности. Вы должны найти прослушиватель.
  6. Щелкните прослушиватель правой кнопкой мыши, выберите Свойства, введите соответствующий номер порта для прослушивателя и нажмите кнопку ОК.

Метод 2. Связывание прослушивателя с существующим кластеризованным экземпляром SQL Server отработки отказа (SQLFCI)

Если вы размещаете группу доступности в экземпляре отказоустойчивой кластеризации SQL Server (SQLFCI), вы можете связать кластеризованный ресурс прослушивателя с кластеризованной группой ресурсов SQLFCI во время удаления, а затем повторно создать группу доступности.

  1. Запустите диспетчер отказоустойчивости кластеров, а затем выберите Роли в области слева.

  2. В области со списком ролей выберите исходную группу доступности.

  3. В нижней средней области на вкладке Ресурсы щелкните правой кнопкой мыши ресурс группы доступности и выберите Пункт Свойства.

  4. Перейдите на вкладку Зависимости , удалите зависимость прослушивателя и нажмите кнопку ОК.

  5. В нижней средней области на вкладке Ресурсы щелкните прослушивателя правой кнопкой мыши, выберите Дополнительные действия, а затем выберите Назначить другую роль.

  6. В диалоговом окне Назначение ресурса роли щелкните экземпляр FCI SQL Server и нажмите кнопку ОК.

    Снимок экрана: диалоговое окно

  7. В области Роли выберите группу SQLFCI. В нижней средней области на вкладке Ресурсы должен появиться новый ресурс прослушивателя.

Это гарантирует, что приложения, использующие прослушиватель, по-прежнему могут использовать его для подключения к экземпляру SQL Server, на котором размещаются рабочие базы данных без прерывания. Исходную группу доступности теперь можно удалить и повторно создать. Кроме того, базы данных и реплики можно добавить в новую группу доступности.

После повторного создания группы доступности переназначьте прослушиватель обратно роли группы доступности. Затем настройте зависимость между новым ресурсом группы доступности и прослушивателем и переназначьте порт прослушивателю:

  1. Запустите диспетчер отказоустойчивости кластеров, а затем выберите Роли в области слева.
  2. В области со списком ролей щелкните исходную роль SQLFCI.
  3. В нижней средней области на вкладке Ресурсы щелкните прослушивателя правой кнопкой мыши, выберите Дополнительные действия, а затем выберите Назначить другую роль.
  4. В диалоговом окне щелкните повторно созданную группу доступности и нажмите кнопку ОК.
  5. В области Роли выберите новую группу доступности.
  6. На вкладке Ресурсы вы увидите новую группу доступности и ресурс прослушивателя. Щелкните правой кнопкой мыши новый ресурс группы доступности и выберите Пункт Свойства.
  7. Перейдите на вкладку Зависимости , выберите ресурс прослушивателя в раскрывающемся списке и нажмите кнопку ОК.
  8. В SQL Server Management Studio используйте обозреватель объектов для подключения к экземпляру SQL Server, на котором размещается основной реплика новой группы доступности.
  9. Выберите Always On Высокий уровень доступности, щелкните новую группу доступности, а затем выберите Прослушиватели группы доступности. Вы должны найти прослушиватель.
  10. Щелкните прослушиватель правой кнопкой мыши, выберите Свойства, введите соответствующий номер порта для прослушивателя и нажмите кнопку ОК.

Способ 3. Удалите группу доступности, а затем повторно создайте группу доступности и прослушиватель с тем же именем прослушивателя.

Этот метод приведет к небольшому сбою для приложений, которые в настоящее время подключены, так как группа доступности и прослушиватель удаляются, а затем создаются повторно:

  1. Удалите группу доступности.

    Примечание.

    Это также приведет к удалению прослушивателя.

  2. Немедленно создайте пустую группу доступности, включающую определение прослушивателя, на том же сервере, где размещаются рабочие базы данных.

    Например, предположим, что прослушиватель группы доступности имеет aglisten. Следующая инструкция Transact-SQL создает группу доступности без базы данных-источника или базы данных-получателя, но также создает прослушиватель с именем aglisten. Приложения могут использовать этот прослушиватель для подключения.

    USE master
    GO
        CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
            ENDPOINT_URL = 'tcp://sqlnode1:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL
        ) LISTENER 'aglisten' (
            WITH IP ((N'11.0.0.25', N'255.0.0.0')),
            PORT = 1433
        )
    GO
    
  3. Восстановите поврежденную базу данных. Затем добавьте его, а вторичная реплика обратно в группу доступности.