Вам потребуется предыдущая полная резервная копия и все резервные копии журналов, сделанные с момента последней полной резервной копии
1) Возьмите хвост резервного копирования журнала
BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE
2) Найти транзакцию для удаленных записей (операция будет LOP_DELETE_ROWS для DELETE и LOP_SET_BITS & LOP_MODIFY_ROW для TRUNCATE TABLE)
SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'
3) Восстановить предыдущее полное резервное копирование и создать резервные копии журналов, а также хвост новой базы данных WITH NORECOVERY и STOPAT = 'Перед началом времени для транзакции'
RESTORE DATABASE NewDB
FROM DISK='C:\Previous_Full_Backup_Of_OldDB.bak'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM',
MOVE 'OldDB' TO 'C:\DATABASES\NewDB.mdf',
MOVE 'OldDB_Log' TO 'C:\DATABASES\NewDB.ldf'
RESTORE LOG NewDB
FROM DISK='C:\Previous_TranLog_Backup_Of_OldDB.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'
RESTORE LOG NewDB
FROM DISK='C:\OldDB_Tail.trn'
WITH NORECOVERY,
STOPAT='2012/01/11 11:35AM'
-- This recovers the restored database and allows access
RESTORE DATABASE NewDB WITH RECOVERY
Этот блог разместить обложки более подробно находя время STOPAT с помощью fn_dblog. Этот пост в блоге посвящен восстановлению данных непосредственно из журнала, но это может занять очень много времени по сравнению с моментом восстановления.
Также в этом блоге Роберта Л. Дэвиса есть пример объединения STOP и STANDBY, чтобы вы могли запрашивать состояние баз данных в разные моменты времени.