goo*_*yui 9 sql-server-2005 sql-server backup recovery restore
我们使用的是 SQL 2005 Express Edition。我们要从 LDF 文件中读取数据以恢复一些已删除的记录。
我们尝试使用 ApexSQL 的试用版,这对我们有很大帮助。我们不是去寻找第三方软件,而是试图弄清楚如何自己读取日志文件。
我们如何从 LDF 文件中读取和恢复数据?
Mar*_*inC 11
您将需要先前的完整备份以及自上次完整备份以来进行的任何日志备份
1) 取一个尾部的日志备份
BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE
Run Code Online (Sandbox Code Playgroud)
2) 查找已删除记录的事务(对于 DELETE,操作将是 LOP_DELETE_ROWS,对于 TRUNCATE TABLE,操作将是 LOP_SET_BITS & LOP_MODIFY_ROW)
SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'
Run Code Online (Sandbox Code Playgroud)
3) 将以前的完整备份和日志备份以及尾部恢复到新数据库 WITH NORECOVERY 和 STOPAT='Just Before Begin Time for 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
Run Code Online (Sandbox Code Playgroud)
这篇博文更详细地介绍了如何使用 fn_dblog 找到 STOPAT 的时间。这篇博文尝试了直接从日志中恢复数据,但与时间点恢复相比,这可能非常耗时。
此外,Robert L Davis 的这篇博文有一个关于结合 STOP 和 STANDBY 以允许您查询不同时间点的数据库状态的示例。