DBAtlas · Атлас эксплуатации баз данных

Восстановление на момент времени (point-in-time restore, STOPAT)

SQL ServerВосстановление

Команда

-- Restore under a side name, keep the original intact:
RESTORE DATABASE [Musteri_PITR]
FROM DISK = N'D:\Backup\Musteri_full_20261008.bak'
WITH MOVE N'Musteri'     TO N'D:\Data\Musteri_PITR.mdf',
     MOVE N'Musteri_log' TO N'D:\Log\Musteri_PITR_log.ldf',
     NORECOVERY, STATS = 10;

RESTORE DATABASE [Musteri_PITR]
FROM DISK = N'D:\Backup\Musteri_diff_20261008.bak' WITH NORECOVERY;

-- All log backups in order, each with the same STOPAT:
RESTORE LOG [Musteri_PITR] FROM DISK = N'D:\Backup\Musteri_log_1200.trn'
WITH NORECOVERY, STOPAT = '2026-10-08T14:29:00';
RESTORE LOG [Musteri_PITR] FROM DISK = N'D:\Backup\Musteri_log_1500.trn'
WITH NORECOVERY, STOPAT = '2026-10-08T14:29:00';

RESTORE DATABASE [Musteri_PITR] WITH RECOVERY;

-- Alternative: step forward with STANDBY and read data at each point:
-- RESTORE LOG [Musteri_PITR] FROM DISK = N'...' WITH STANDBY = N'D:\Backup\Musteri_PITR_undo.dat', STOPAT = '...';

Что делает

Применяет FULL + (необязательно) DIFF + копии журнала WITH NORECOVERY и останавливает воспроизведение журнала в заданное время; возвращает базу в состояние непосредственно перед ошибочной операцией (неверный DELETE/UPDATE, DROP).

Когда использовать

Для восстановления случайно удалённых/изменённых данных, изучения данных на определённый момент или для аудита.

Внимание

Восстанавливайте под другим именем, а не поверх оригинала, затем копируйте нужные строки обратно; если восстанавливать поверх необходимо, сначала сделайте копию заключительного фрагмента журнала. STOPAT — в локальном времени сервера. Модель восстановления должна быть FULL; если копия журнала, содержащая время STOPAT, включает операции с минимальным протоколированием под BULK_LOGGED, остановиться внутри этой копии нельзя. После RESTORE ... WITH RECOVERY больше журналов применить нельзя.

Открыть в DBAtlas →

Связанные материалы