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