Автоматическое восстановление страниц (группы доступности: зеркальное отображение баз данных)

Область применения:SQL Server

Автоматическое восстановление страниц поддерживается зеркальным отображением базы данных и группами доступности AlwaysOn. После того как страница повреждается в результате некоторых типов ошибок и становится нечитаемой, партнер по зеркальному отображению базы данных (главный сервер или зеркальный сервер) либо реплика группы доступности (первичная или вторичная) пытается автоматически восстановить страницу. Участник или реплика, для которой считывание страницы невозможно, запрашивает новую копию у другого участника или реплики. Если этот запрос завершается успешно, нечитаемая страница заменяется читаемой копией, что обычно устраняет ошибку.

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

Примечание.

Автоматическое восстановление страниц отличается от восстановления DBCC. При автоматическом восстановлении страниц все данные сохраняются. Напротив, при использовании параметра REPAIR_ALLOW_DATA_LOSS для исправления ошибок может потребоваться удалить некоторые страницы и, следовательно, данные.

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

Система автоматического восстановления страниц зеркального отображения базы данных восстанавливает только страницы, которые находятся в файле данных, для которого операция завершилась с одной из ошибок, перечисленных в приведенной ниже таблице.

Номер ошибки Описание Случаи, при которых предпринимается попытка автоматического восстановления страницы
823 Действие предпринимается только в том случае, если операционная система выполнила циклическую проверку избыточности (CRC), которая завершилась неудачно для этих данных. ERROR_CRC. Код этой ошибки в операционной системе — 23.
824 Логические ошибки. Логические ошибки данных, например разрыв записи или неверная контрольная сумма страницы.
829 Страница отмечена, как ожидающая восстановления. Все.

Чтобы просмотреть недавние ошибки CRC 823 и ошибки 824, см. таблицу suspect_pages в базе данных msdb.

Типы страниц, которые не подлежат автоматическому восстановлению

Автоматическое восстановление страниц не может исправить следующие типы страниц управления.

  • Страница заголовка файла (идентификатор страницы 0).

  • Страница 9 (загрузочная страница базы данных).

  • Страницы распределения: страницы глобальной карты распределения (GAM), страницы общей глобальной карты распределения (SGAM) и страницы свободного места на странице (PFS).

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

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

  1. При возникновении ошибки чтения на странице данных в основной/первичной базе данных основная/первичная база данных добавляет строку в таблицу suspect_pages с соответствующим статусом ошибки. При зеркалировании базы данных основной сервер затем запрашивает копию страницы у зеркального сервера. Для групп доступности AlwaysOn основной передает запрос всем вторичным файлам и получает страницу от первого ответа. В запросе указывается идентификатор страницы и номер LSN, находящийся в данный момент в конце текущего журнала. Страница помечается как ожидающая восстановления. Это делает ее недоступной во время попытки автоматического восстановления страницы. Любое обращение к этой странице во время попытки восстановления завершится с ошибкой 829 (ожидает восстановления).

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

  3. Основной сервер/первичный сервер обрабатывает ответ, содержащий новую копию страницы.

  4. После того как попытка автоматического восстановления завершается успешно, подозрительная страница отмечается в таблице suspect_pages как восстановленная (event_type = 5).

  5. Если ошибка ввода-вывода вызвала возникновение каких-либо отложенных транзакций, то после восстановления страницы основной/первичный сервер попытается разрешить эти транзакции.

Обработка ошибок ввода-вывода в зеркальной/вторичной базе данных

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

  1. В случае с зеркальным отображением баз данных, если зеркальный сервер обнаруживает одну или несколько ошибок ввода-вывода при восстановлении записи журнала, сеанс зеркального отображения переходит в состояние SUSPENDED. В группах доступности Always On, если вторичная реплика сталкивается с одной или несколькими ошибками страничного ввода-вывода при повторном выполнении записи журнала, вторичная база данных переходит в состояние SUSPENDED. В этот момент зеркальный/вторичный сервер вставляет в таблицу suspect_pages строку с соответствующим состоянием ошибки. Затем зеркальный/вторичный сервер запрашивает копию страницы у основного/первичного сервера.

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

  3. Если зеркальный/вторичный сервер получает копии всех запрошенных страниц, он попытается возобновить сеанс зеркального отображения. Если попытка автоматического восстановления завершается успешно, подозрительная страница отмечается в таблице suspect_pages как восстановленная (event_type = 4).

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

Рекомендации разработчикам

Автоматическое восстановление страниц — это асинхронный процесс, выполняющийся в фоновом режиме. Поэтому, если в ходе операции базы данных запрашивается нечитаемая страница, возникает ошибка и возвращается код события, вызвавшего эту ошибку. При разработке приложения для зеркальной базы данных или базы данных группы доступности следует перехватывать исключения, возникающие при сбое операций. Если код ошибки SQL Server равен 823, 824 или 829, повторите операцию позже.

Практическое руководство. Просмотр попыток автоматического восстановления страницы

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

  • Группы доступности AlwaysOn

    sys.dm_hadr_auto_page_repair (Transact-SQL)

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

  • Зеркалирование базы данных:

    sys.dm_db_mirroring_auto_page_repair (Transact-SQL)

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