如何从LDF文件恢复数据?


9

我们正在使用SQL 2005 Express Edition。我们想从LDF文件中读取数据,以恢复一些已删除的记录。

我们尝试使用ApexSQL的试用版,这对我们有很大帮助。而不是寻求第三方软件,我们试图找出如何自己读取日志文件的方法。

我们如何从LDF文件读取和恢复数据?


数据库是使用完整恢复模型还是仅使用简单恢复模型?
MartinC 2012年

是的,我们使用完全恢复模型
goofyui 2012年

我们能够使用ApexSQL试用版恢复数据。试用版仅允许查看数据。我们没有预算购买完整版,因此想自己找出要从.ldf文件中恢复数据的方式
goofyui 2012年

Answers:


11

您将需要先前的完全备份以及自上次完全备份以来进行的所有日志备份

1)备份日志

BACKUP LOG OldDB TO DISK='C:\OldDB_Tail.trn' WITH NO_TRUNCATE

2)查找已删除记录的事务(对于DELETE,操作将为LOP_DELETE_ROWS;对于TRUNCATE TABLE,操作将为LOP_SET_BITS和LOP_MODIFY_ROW)

SELECT * FROM fn_dblog(NULL,NULL) WHERE AllocUnitName = 'dbo.YourTableName'

3)使用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

这篇博客文章更详细地介绍了使用fn_dblog查找到STOPAT的时间。这篇博客文章直接从日志中恢复数据,但是与时间点恢复相比可能非常耗时。

同样,Robert L Davis的博客文章中还提供了一个示例,该示例结合了STOP和STANDBY,使您可以查询不同时间点的数据库状态。


截断记录呢?我认为其中一些也被截断了.. !!
goofyui 2012年

1)如何从我的旧数据库中获取.trn。我有.ldf,.mdf!我没有交易日志文件。
goofyui 2012年

这里的想法是将数据库恢复到丢失数据之前的位置,然后您将能够复制丢失的数据。BACKUP LOG命令是根据事务日志(ldf)的活动部分创建trn文件的过程
MartinC 2012年

我发现很难完全理解你的观点。您能否分享进行操作的语法..例如,将其保留为发生意外的OldDB以及将要恢复OldDB日志文件的NewDB ..
goofyui 2012年

1
我添加了更多详细信息和指向博客的链接,以查找恢复到的时间点,还添加了另一个博客,内容涉及使用fn_dblog的输出来重新生成已删除的行。
MartinC 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.