Постраничное восстановление базы MSSQL (Page Restore) без остановки работы
Постраничное восстановление (Page Restore) необходимо, когда повреждено небольшое количество конкретных страниц данных:
- Ошибки чтения 824 с указанием конкретного
Page IDв логах; - Записи о битых страницах в системной таблице
msdb.dbo.suspect_pages; - Недопустимость остановки работы всей базы данных компании (Zero Downtime requirement) ради исправления единичной страницы.
1. Определение идентификаторов поврежденных страниц
SELECT database_id, file_id, page_id, event_type, error_count
FROM msdb.dbo.suspect_pages
WHERE event_type IN (1, 2, 3); -- 1: 823/824 Checksum error, 2: Bad Checksum, 3: Torn PageПредположим, повреждена страница: FileId = 1, PageId = 54288 в базе ERP_1C.
2. Снятие актуального хвостового лога (Tail-Log)
В редакциях Enterprise база данных остается доступной для всех пользователей (Online), кроме транзакций, обращающихся напрямую к поврежденной странице:
BACKUP LOG [ERP_1C]
TO DISK = N'E:\Backup\ERP_1C_Tail.trn'
WITH NORECOVERY; -- При Online-восстановлении в Enterprise можно использовать стандартный бэкап лога3. Процедура постраничного восстановления (Page Restore)
-- 1. Восстановление поврежденной страницы из Full бэкапа
RESTORE DATABASE [ERP_1C]
PAGE = '1:54288'
FROM DISK = N'E:\Backup\ERP_1C_Full.bak'
WITH NORECOVERY;
-- 2. Накат последнего Diff (если страница модифицировалась позже)
RESTORE DATABASE [ERP_1C]
PAGE = '1:54288'
FROM DISK = N'E:\Backup\ERP_1C_Diff.bak'
WITH NORECOVERY;
-- 3. Накат цепочки логов транзакций
RESTORE LOG [ERP_1C]
FROM DISK = N'E:\Backup\Log\ERP_1C_Log_01.trn'
WITH NORECOVERY;
RESTORE LOG [ERP_1C]
FROM DISK = N'E:\Backup\ERP_1C_Tail.trn'
WITH RECOVERY;
GO4. Проверка восстановленной страницы
DBCC CHECKPAGE ('ERP_1C', 1, 54288, 3); Частые вопросы (FAQ)
Поддерживается ли Online Page Restore в редакции SQL Server Standard?
В редакции Standard постраничное восстановление поддерживается, но только в режиме Offline (база должна быть переведена в состояние Restoring / Single-User). Режим честного Online восстановления доступен только в редакции Enterprise / Developer.
Можно ли восстановить страницу распределения GAM/SGAM через Page Restore?
Нет. Постраничное восстановление применимо только к страницам данных и индексов. Системные страницы распределения пространства (GAM, SGAM, PFS) и критические системные метаданные через PAGE restore восстановить нельзя.
Сколько страниц можно указать в одном запросе RESTORE PAGE?
В одной команде RESTORE DATABASE ... PAGE можно передать до 1000 страниц через запятую: PAGE = '1:54288, 1:54289, 2:104'.
Что делать, если suspect_pages содержит тысячи битых страниц?
Если повреждено более 1% страниц файла данных, постраничное восстановление нерационально и займет больше времени, чем полное восстановление файла данных (File Restore) или всей базы целиком.