从事务日志问题中恢复数据库

时间:2011-03-11 14:09:51

标签: sql-server sql-server-2008 transactions

我按照说明here保存数据库状态,并从之前保存的任何状态恢复它。但是,我无法在示例中给出RESTORE。我总是收到一条消息

  

此日志文件包含记录的记录   在指定标记之前。该   数据库正在留在   恢复状态,以便您可以申请   另一个日志文件。

我认为问题出在FILE版本上,但是从我在示例中看到的,它应该是DB中的N和Log中的N-1,这就是我总是设置它的方式。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

听起来您需要应用更多的事务日志。您必须首先使用完整备份将数据库还原到过去的某个点。然后,您可以恢复零个或多个差异备份(按顺序),以尽可能向前跳过。最后,您必须还原具有日志记录的每个事务日志,该日志记录从最近恢复的备份(完整或差异)开始一直到有问题的还原时间。

RESTORE DATABASE Blah FROM DISK = 'blah 201105210000.bak' WITH NORECOVERY;
RESTORE LOG Blah_Log FROM DISK = 'blah 201105210100.trn' WITH NORECOVERY;
RESTORE LOG Blah_Log FROM DISK = 'blah 201105210200.trn' WITH NORECOVERY;
RESTORE LOG Blah_Log FROM DISK = 'blah 201105210300.trn' WITH NORECOVERY;
RESTORE LOG Blah_Log FROM DISK = 'blah 201105210400.trn' WITH NORECOVERY;
RESTORE LOG Blah_Log FROM DISK = 'blah 201105210500.trn' WITH STOPAT 'x', RECOVERY;

我的语法可能不完美,但概念很可靠,您必须按顺序恢复所有事务日志。如果您选择太早的t-log,则会收到有关该消息的消息,或者如果您选择一个太晚的消息,则会收到不同的消息。您发布的消息向我表明,您尝试应用的t-log完全在应用上次恢复的事务ID之前有日志记录。从那之后找到更多的t-logs。

如果不应丢失t-logs,请查看SQL作业或维护计划,以查看是否有两个t-log备份按不同的计划进行。如果发生这种情况,您必须从两个备份中收集所有t-logs,因为它们只能是一个正确且不间断的链,可以让您恢复到您想要的时间点。

答案 1 :(得分:-1)

当指定STOPAT参数时,即使指定了RECOVERY,SQL Server(至少2008 Express)似乎也会采用NORECOVERY选项。我认为这就是它生成消息的原因(不是实际的错误,对吗?)。要完成此操作,可以在流程中添加一个额外步骤。

...
RESTORE LOG      Blah_Log FROM DISK = 'blah 201105210500.trn' WITH STOPAT 'x' WITH NORECOVERY;
RESTORE DATABASE Blah_Log WITH RECOVERY;