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


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

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

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

Итоги

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

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

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
    

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

    Msg 3104, level 16, State 1, Line 1
    RESTORE не может работать с базой данных DatabaseName>, так как она настроена для зеркального отображения базы данных <или присоединена к группе доступности. Если вы планируете восстановить базу данных, используйте ALTER DATABASE для удаления зеркального отображения или удаления базы данных из своей группы доступности.

    Сообщение 3013, уровень 16, состояние 1, строка 1
    RESTORE DATABASE завершается аномально.

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

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

    DROP DATABASE <DatabaseName>
    

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

    Msg 3752, Level 16, State 1, Line 1
    Имя базы данных <> в настоящее время присоединено к группе доступности. Прежде чем удалить базу данных, необходимо удалить ее из группы доступности.

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

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

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

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

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

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

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

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

    Msg 921, Level 16, State 112, Line 1
    Имя базы данных <> еще не восстановлено. Подождите и повторите попытку.

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

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

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

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

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

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

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

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

  1. Запустите диспетчер отказоустойчивости кластеров и выберите роли в левой области. В области с списком ролей щелкните новую группу доступности, в которую размещается прослушиватель.
  2. В нижней средней области на вкладке "Ресурсы " щелкните прослушиватель правой кнопкой мыши, выберите "Дополнительные действия" и выберите " Назначить другой роли". В диалоговом окне выберите повторно созданную группу доступности и нажмите кнопку "ОК".
  3. В области ролей щелкните повторно созданную группу доступности. На нижней средней панели на вкладке "Ресурсы" вы увидите созданную повторно группу доступности и ресурс прослушивателя. Щелкните правой кнопкой мыши ресурс группы доступности, а затем выберите "Свойства".
  4. Откройте вкладку "Зависимости" , выберите ресурс прослушивателя в раскрывающемся списке и нажмите кнопку "ОК".
  5. В SQL Server Management Studio используйте обозреватель объектов для подключения к экземпляру SQL Server, на котором размещена основная реплика повторно созданной группы доступности. Выберите "Высокий уровень доступности AlwaysOn", щелкните новую группу доступности и выберите прослушиватели групп доступности. Вы должны найти прослушиватель.
  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. Выберите "Высокий уровень доступности AlwaysOn", щелкните новую группу доступности и выберите прослушиватели групп доступности. Вы должны найти прослушиватель.
  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. Восстановите поврежденную базу данных. Затем добавьте его и вторичную реплику обратно в группу доступности.