Как перевести базу данных SQL Server в состояние Recovery Pending
Пересказ статьи John Morehouse. How to put a SQL Server Database into Recovery Pending
Вы могли бы спросить, зачем кому-то на земле понадобилось переводить базу данных в нежелательное состояние, а конкретно в состояние Recovery Pending (ожидание восстановления). Ну, в моем случае имелась клиентская база данных, которая вошла в это состояние в результате отказа хранилища. К счастью, это не была производственная база данных, поэтому у меня было время найти наилучший способ исправить проблему.
Фраза, которая часто использовалась во время моей службы в пожарной части, была такой: «Попробуй, прежде чем совать нос». Нужно ли выбивать входную дверь? Возможно она не заперта и, сначала попробовав (своим ботинком), я могу предотвратить повреждение двери. В подобных сценариях эта философия верна. Проверка на некритичных базах данных поможет предотвратить любые дальнейшие повреждения.
В данном случае я захотел проверить, прежде чем предпринимать некие действия, которые могли привести к повреждению. Это означало, что я должен был перевести тестовую базу данных в состояние восстановления. Переведя её в требуемое состояние, затем я могу испытать различные методы, чтобы правильно восстановить базу данных. Определившись с успешным решением, я смогу уверенно сунуть нос в поврежденную производственную базу данных, зная, что я использую проверенный метод.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: НЕ ДЕЛАЙТЕ ЭТОГО НА ПРОИЗВОДСТВЕННОМ ЭКЗЕМПЛЯРЕ SQL SERVER.
Вас предупредили.
Вот как я это делал:
База данных перейдет в режим ожидания восстановления после перезапуска службы SQL Server.
Когда база данных снова пытается перейти в оперативный режим, она будет переведена в состояние ожидания восстановления, поскольку отсутствует файл журнала, и имелась открытая транзакция, когда служба была выключена. При обычном функционировании даже при открытой транзакции SQL Server прошел бы фазу восстановления журнала транзакций. При восстановлении на фазе отката SQL Server попытался бы откатить транзакцию, которая была открыта на момент рестарта, и отменить изменения. Поскольку файл журнала теперь отсутствует, это невозможно сделать.
Следовательно, база данных теперь находится в состоянии ожидания восстановления. Это ожидание восстановления обусловлено открытой транзакцией, но SQL Server не может перевести базу данных в согласованное состояние.
Когда это происходит, вы видите что-то подобное в журнале ошибок:
Если база данных закрыта чисто, и файл журнала транзакций удален/переименован/и т.д., SQL Server просто перестроит для вас файл журнала.
Иногда полезно иметь возможность перевести базу данных в конкретное состояние с тем, чтобы вы могли проверить решения прежде, чем выполнять какое-либо действие в условиях производства. Просто не забудьте попробовать, прежде чем сунуть нос. Если вы этого не сделаете, то можете только ухудшить ситуацию, поэтому излишняя осторожность не помешает.
В данном случае я захотел проверить, прежде чем предпринимать некие действия, которые могли привести к повреждению. Это означало, что я должен был перевести тестовую базу данных в состояние восстановления. Переведя её в требуемое состояние, затем я могу испытать различные методы, чтобы правильно восстановить базу данных. Определившись с успешным решением, я смогу уверенно сунуть нос в поврежденную производственную базу данных, зная, что я использую проверенный метод.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: НЕ ДЕЛАЙТЕ ЭТОГО НА ПРОИЗВОДСТВЕННОМ ЭКЗЕМПЛЯРЕ SQL SERVER.
Вас предупредили.
Как перевести базу данные в режим ожидания восстановления?
Вот как я это делал:
- Начать новую транзакцию.
- Создать новую таблицу.
- Остановить службу SQL Server.
- Переименовать/удалить файл журнала базы данных.
- Перезапустить службу SQL Server.
База данных перейдет в режим ожидания восстановления после перезапуска службы SQL Server.
Почему база данных находится в режиме ожидания восстановления?
Когда база данных снова пытается перейти в оперативный режим, она будет переведена в состояние ожидания восстановления, поскольку отсутствует файл журнала, и имелась открытая транзакция, когда служба была выключена. При обычном функционировании даже при открытой транзакции SQL Server прошел бы фазу восстановления журнала транзакций. При восстановлении на фазе отката SQL Server попытался бы откатить транзакцию, которая была открыта на момент рестарта, и отменить изменения. Поскольку файл журнала теперь отсутствует, это невозможно сделать.
Следовательно, база данных теперь находится в состоянии ожидания восстановления. Это ожидание восстановления обусловлено открытой транзакцией, но SQL Server не может перевести базу данных в согласованное состояние.
Когда это происходит, вы видите что-то подобное в журнале ошибок:
Если база данных закрыта чисто, и файл журнала транзакций удален/переименован/и т.д., SQL Server просто перестроит для вас файл журнала.
Выводы
Иногда полезно иметь возможность перевести базу данных в конкретное состояние с тем, чтобы вы могли проверить решения прежде, чем выполнять какое-либо действие в условиях производства. Просто не забудьте попробовать, прежде чем сунуть нос. Если вы этого не сделаете, то можете только ухудшить ситуацию, поэтому излишняя осторожность не помешает.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой