Аварийный режим EMERGENCY и REPAIR_ALLOW_DATA_LOSS в MSSQL: спасение базы
Крайняя мера восстановления базы данных применяется в следующих безвыходных ситуациях:
- Полное физическое уничтожение или повреждение заголовка файла журнала транзакций (
.ldf) при отсутствии бэкапов; - Фатальные повреждения критических системных каталогов базы данных (sysallocunits, sysrowsets, Allocation Maps);
- База зависает в цикличном сбое при старте, блокируя любой доступ пользователям.
1. Архитектура аварийного восстановления
Параметр REPAIR_ALLOW_DATA_LOSS выполняет комплекс деструктивных, но необходимых операций:
- Восстанавливает целостность распределения страниц (PFS, GAM, SGAM);
- Удаляет битые страницы данных из цепочек таблиц и индексов;
- При отсутствии или разрушении LDF файла — принудительно генерирует новый пустой журнал транзакций.
2. Пошаговый сценарий спасения базы
USE [master];
GO
-- 1. Переводим базу в Emergency и Single-User режим
ALTER DATABASE [ERP_1C] SET EMERGENCY;
GO
ALTER DATABASE [ERP_1C] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 2. Запуск деструктивного восстановления и пересоздания журнала транзакций
DBCC CHECKDB ([ERP_1C], REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
-- 3. Возврат в многопользовательский режим
ALTER DATABASE [ERP_1C] SET MULTI_USER;
GO3. Пересоздание LDF принудительно через ATTACH_REBUILD_LOG
Если файл LDF полностью утерян, а MDF цел:
CREATE DATABASE [ERP_1C] ON
( FILENAME = N'D:\Data\ERP_1C.mdf' )
FOR ATTACH_REBUILD_LOG;
GO4. Обязательные действия после восстановления
После применения REPAIR_ALLOW_DATA_LOSS логическая целостность бизнес-логики нарушена. Выполните:
- Тестирование и исправление в конфигураторе 1С:Предприятие (ТИИ);
- Создание полного бэкапа (Full Backup), так как цепочка LSN была разорвана;
- Сверка ключевых балансовых отчетов и регистров.
Частые вопросы (FAQ)
Гарантирует ли REPAIR_ALLOW_DATA_LOSS 100% восстановление базы?
Нет. Если повреждены критические метаданные (системные таблицы нижнего уровня ядра), команда завершится ошибкой. В этом случае единственным выходом будет извлечение уцелевших данных через BCP/SELECT в новую пустую базу.
Почему после исправления база находится в модели восстановления SIMPLE?
Принудительное пересоздание журнала транзакций и удаление страниц сбрасывает метаданные транзакций. SQL Server автоматически переводит базу в режим Simple. Необходимо вручную вернуть модель Full и сделать новый Full Backup.
Как минимизировать объем удаляемых строк при восстановлении?
Перед запуском CHECKDB попробуйте выгрузить максимальное количество таблиц в CSV/скрипты в режиме EMERGENCY через SELECT INTO или утилиту bcp.
Можно ли выполнить откат операции REPAIR_ALLOW_DATA_LOSS?
Нет, операция не откатывается через транзакцию. Обязательно скопируйте поврежденные файлы .mdf на уровне проводника Windows перед выполнением скрипта.