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

Применимо к:SQL Server

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

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

Примечание

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

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

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

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

Просмотреть все недавние ошибки 823 (CRC) и 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. Если ошибка ввода-вывода вызвала возникновение каких-либо отложенных транзакций, то после восстановления страницы основной/первичный сервер попытается разрешить эти транзакции.

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

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

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

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

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

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

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

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

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

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

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

    sys.dm_hadr_auto_page_repair (Transact-SQL)

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

  • Зеркальное отображение базы данных

    sys.dm_db_mirroring_auto_page_repair (Transact-SQL)

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

См. также:

Управление таблицей suspect_pages (SQL Server)
Обзор групп доступности AlwaysOn SQL Server)
Зеркальное отображение базы данных (SQL Server)