Vous aurez besoin d'une sauvegarde complète précédente et de toutes les sauvegardes de journaux effectuées depuis la dernière sauvegarde complète
1) Prenez la queue de la sauvegarde du journal
BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE
2) Rechercher la transaction pour les enregistrements supprimés (l'opération sera LOP_DELETE_ROWS pour DELETEs et LOP_SET_BITS & LOP_MODIFY_ROW pour une TRUNCATE TABLE)
SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'
3) Restaurer les sauvegardes complètes précédentes et les journaux plus la queue dans une nouvelle base de données AVEC NORECOVERY et STOPAT = 'Juste avant le début de la transaction'
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
Ce billet de blog traite plus en détail de la recherche de l'heure d'arrêt avec fn_dblog. Ce billet de blog tente de récupérer des données directement à partir du journal, mais cela peut prendre beaucoup de temps par rapport à une récupération ponctuelle.
De plus, cet article de blog de Robert L Davis a un exemple sur la combinaison de STOP et STANDBY pour vous permettre d'interroger l'état des bases de données à différents moments.