Автоматическое восстановление страниц (группы доступности: зеркальное отображение баз данных)
Область применения: SQL Server
Автоматическое восстановление страниц поддерживается зеркальным отображением базы данных и группами доступности AlwaysOn. После повреждения страниц вследствие ошибок определенных типов, после чего страницы становятся нечитаемыми, база данных, участвующая в зеркальном отображении (главная или зеркало), либо реплика доступности (основная или вторичная) выполняет попытку автоматического восстановления страницы. Участник или реплика, для которой считывание страницы невозможно, запрашивает новую копию у другого участника или реплики. Если этот запрос завершается успешно, нечитаемая страница заменяется читаемой копией, что обычно устраняет ошибку.
Как правило, зеркальное отображение баз данных и группы доступности AlwaysOn обрабатывают ошибки ввода-вывода аналогичным образом. В этом разделе описываются немногие из отличий.
Примечание.
Автоматическое восстановление страниц отличается от восстановления DBCC. При автоматическом восстановлении страниц все данные сохраняются. При исправлении ошибок с помощью параметра REPAIR_ALLOW_DATA_LOSS может потребоваться удаление некоторых страниц и, следовательно, данных.
Типы ошибок, вызывающие попытку автоматического восстановления страницы
Типы страниц, которые не подлежат автоматическому восстановлению
Обработка ошибок ввода-вывода в базе данных-получателе или в базе данных-источнике
Обработка ошибок ввода-вывода в зеркальной базе данных или базе данных-получателе
Практическое руководство. Просмотр попыток автоматического восстановления страницы
Типы ошибок, вызывающие попытку автоматического восстановления страницы
Система автоматического восстановления страниц зеркального отображения базы данных восстанавливает только страницы, которые находятся в файле данных, для которого операция завершилась с одной из ошибок, перечисленных в приведенной ниже таблице.
Номер ошибки | Description | Экземпляры, вызывающие попытку автоматического восстановления страницы |
---|---|---|
823 | Действие предпринимается только в том случае, если операционная система выполнила циклическую проверку избыточности (CRC), которая завершилась неудачно для этих данных. | ERROR_CRC. Код этой ошибки в операционной системе — 23. |
824 | Логические ошибки. | Логические ошибки данных, например прерванная запись или несовпадающая контрольная сумма страницы. |
829 | Страница отмечена, как ожидающая восстановления. | Все. |
Просмотреть все недавние ошибки 823 (CRC) и 824 можно в таблице suspect_pages базы данных msdb .
Типы страниц, которые не подлежат автоматическому восстановлению
Автоматическое восстановление страниц не может исправить следующие типы страниц управления.
Страница заголовка файла (идентификатор страницы 0).
Страница 9 (загрузочная страница базы данных).
Страницы распределения: страницы глобальной карты распределения (GAM), страницы общей глобальной карты (SGAM) и страницы свободного места на странице (PFS).
Обработка ошибок ввода-вывода в базе данных-получателе или в базе данных-источнике
В основной базе данных или в базе данных-источнике попытка автоматического восстановления страницы предпринимается только если база данных находится в состоянии SYNCHRONIZED, а основная база или база-получатель данных продолжает посылать записи журнала в зеркальную базу данных или в базу данных-получатель. При попытке автоматического восстановления страницы выполняется следующая основная последовательность действий:
При возникновении ошибки чтения на странице данных в базе данных-получателе или в базе данных-источнике база данных-получатель или база данных-источник вставляет в таблицу suspect_pages строку с соответствующим статусом ошибки. При использовании зеркального отображения базы данных, основная база данных запрашивает копию страницы у зеркального сервера. Для групп доступности AlwaysOn основной передает запрос всем вторичным файлам и получает страницу от первого ответа. В запросе указывается идентификатор страницы и номер LSN, находящийся в данный момент в конце текущего журнала. Страница помечается как ожидающая восстановления. Это делает ее недоступной на время попытки автоматического восстановления. Любое обращение к этой странице во время попытки восстановления завершится с ошибкой 829 (ожидает восстановления).
После получения запроса страницы зеркальный/вторичный сервер ожидает, пока его журнал не будет восстановлен до номера LSN, указанного в запросе. Затем зеркальный/вторичный сервер пытается получить доступ к странице в своей копии базы данных. Если к странице возможен доступ, зеркальный/вторичный сервер посылает копию страницы на основной/первичный сервер. В противном случае зеркальный/вторичный сервер возвращает основному/первичному серверу ошибку, а попытка автоматического восстановления страницы завершается неудачно.
Основной сервер/первичный сервер обрабатывает ответ, содержащий новую копию страницы.
После того как попытка автоматического восстановления завершается успешно, подозрительная страница отмечается в таблице suspect_pages как восстановленная (event_type = 5).
Если ошибка ввода-вывода вызвала возникновение каких-либо отложенных транзакций, то после восстановления страницы основной/первичный сервер попытается разрешить эти транзакции.
Обработка ошибок ввода-вывода в зеркальной базе данных или базе данных-получателе
Ошибки ввода-вывода на страницах данных, возникающих в зеркальном или вторичном базах данных, обрабатываются как правило, зеркальным отображением базы данных и группами доступности AlwaysOn.
В случае с зеркальным отображением баз данных, если зеркальный сервер обнаруживает одну или несколько ошибок ввода-вывода при восстановлении записи журнала, сеанс зеркального отображения переходит в состояние SUSPENDED. При наличии групп доступности AlwaysOn, если вторичная реплика сталкивается с одной или несколькими ошибками ввода-вывода страницы при повторном изменении записи журнала, база данных-получатель вводит состояние SUSPENDED. В этот момент зеркальный/вторичный сервер вставляет в таблицу suspect_pages строку с соответствующим состоянием ошибки. Затем зеркальный/вторичный сервер запрашивает копию страницы у основного/первичного сервера.
Основной/первичный сервер пытается получить доступ к странице в своей копии базе данных. Если к странице возможен доступ, основной/первичный сервер отправляет копию страницы на зеркальный/вторичный сервер.
Если зеркальный/вторичный сервер получает копии всех запрошенных страниц, он попытается возобновить сеанс зеркального отображения. Если попытка автоматического восстановления завершается успешно, подозрительная страница отмечается в таблице 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)
Обзор групп доступности Always On (SQL Server)
Зеркальное отображение базы данных (SQL Server)