Автоматическое восстановление страниц (группы доступности/зеркальное отображение баз данных)
Автоматическое восстановление страниц поддерживается за счет зеркального отображения баз данных и с помощью Группы доступности AlwaysOn. После повреждения страниц вследствие ошибок определенных типов, после чего страницы становятся нечитаемыми, база данных, участвующая в зеркальном отображении (главная или зеркало), либо реплика доступности (основная или вторичная) выполняет попытку автоматического восстановления страницы. Участник или реплика, для которой считывание страницы невозможно, запрашивает новую копию у другого участника или реплики. Если этот запрос завершается успешно, нечитаемая страница заменяется читаемой копией, что обычно устраняет ошибку.
В целом зеркальное отображение базы данных и Группы доступности AlwaysOn обрабатывают ошибки ввода-вывода сходным образом. В этом разделе описываются немногие из отличий.
Примечание |
---|
Автоматическое восстановление страниц отличается от восстановления DBCC. При автоматическом восстановлении страниц все данные сохраняются. При исправлении ошибок с помощью параметра REPAIR_ALLOW_DATA_LOSS может потребоваться удаление некоторых страниц и, следовательно, данных. |
Типы ошибок, вызывающие попытку автоматического восстановления страницы
Типы страниц, которые не подлежат автоматическому восстановлению
Обработка ошибок ввода-вывода в базе данных-получателе или в базе данных-источнике
Обработка ошибок ввода-вывода в зеркальной базе данных или базе данных-получателе
Рекомендации разработчикам
Как просматривать попытки автоматического восстановления страницы
Типы ошибок, вызывающих попытку автоматического восстановления страницы
Система автоматического восстановления страниц зеркального отображения базы данных восстанавливает только страницы, которые находятся в файле данных, для которого операция завершилась с одной из ошибок, перечисленных в приведенной ниже таблице.
Код ошибки |
Описание |
Экземпляры, вызывающие попытку автоматического восстановления страницы |
---|---|---|
Действие предпринимается только в том случае, если операционная система выполнила циклическую проверку избыточности (CRC), которая завершилась неудачно для этих данных. |
ERROR_CRC. Код этой ошибки в операционной системе — 23. |
|
Логические ошибки. |
Логические ошибки данных, например прерванная запись или несовпадающая контрольная сумма страницы. |
|
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)