仅从完整备份将数据库恢复到时间点

Sha*_*pta 5 sql-server-2005 sql-server recovery restore recovery-model

我有一个恢复模式设置为 FULL 的数据库。这是一个开发数据库,​​我有两个完整备份,日期分别为 19 日和 27 日,即最新的。

其中一位开发人员在 26 日做了一些更改,我想回滚这些更改并希望将数据库恢复到 25 日的状态。

restore database MyDb from disk = 'I:\MSSQL\DATA\MyDb_20160127.bak'
with recovery, stopat = '2016-01-25 10:38:15.280',
move 'MyDb' to  'I:\MSSQL\DATA\MyDb.mdf',
move 'MyDb_log' to 'I:\MSSQL\DATA\MyDb.ldf'
Run Code Online (Sandbox Code Playgroud)

STOPAT 子句指定一个点太早,无法恢复此备份集。选择不同的停止点或使用 RESTORE DATABASE WITH RECOVERY 在当前点恢复。

我正在使用 SQL Server 2005

Aar*_*and 14

不,您需要获取涵盖您要使用的时间范围的事务日志STOPAT。您不能仅从完整数据库备份中执行此操作 - 这只是一次性副本,这就是为什么我们有不同类型的备份(完整、日志、差异)。

如果您在完整备份之间进行了事务日志备份,请使用该信息更新问题,我们可以向您展示恢复到某个时间点的步骤。但是这些教程很容易找到,所以我怀疑你在这里问是因为你没有进行日志备份。如果是这样的话,你就有点卡住了——你也许可以使用某种日志读取实用程序从当前事务日志中获取该信息,但我对那里的成功没有信心 - 并且该产品似乎没有,至少,具有称为“恢复到时间点”的功能 - 它允许您恢复特定的信息,例如恢复表或撤消截断。所以我认为这将是一个相当手动的“撤消事务 A、撤消事务 B、撤消事务 C 等”来获得最终结果。可能仍然比尝试从fn_dblog输出中自己做更少的工作。

这个帖子比较及时:

这些也可能有用:

为了证明您现在无法进行日志备份并尝试恢复到上次完整备份之前的某个时间点。首先,运行这个脚本:

USE master;
GO
CREATE DATABASE splunk;
GO
ALTER DATABASE splunk SET RECOVERY FULL;
GO
USE splunk;
GO
SELECT GETDATE(); -- use this in STOPAT
GO
WAITFOR DELAY '00:00:10';
GO
BACKUP DATABASE splunk TO DISK = 'c:\temp\sp_full.bak' WITH INIT;
GO
WAITFOR DELAY '00:00:10';
GO
Run Code Online (Sandbox Code Playgroud)

以上模拟了您拥有的内容:您想要恢复到的时间之后进行的完整备份,仅此而已。

现在,进行尾日志备份:

BACKUP LOG splunk TO DISK = 'c:\temp\sp_tail.trn' WITH INIT, NO_TRUNCATE;
GO
Run Code Online (Sandbox Code Playgroud)

现在,让我们开始恢复过程。首先,使用 norecovery 恢复完整备份:

USE master;
GO  
RESTORE DATABASE splunk FROM DISK = 'c:\temp\sp_full.bak' WITH REPLACE, NORECOVERY;
GO
Run Code Online (Sandbox Code Playgroud)

现在,尝试将STOPAT参数设置为上面输出的任何内容来恢复尾日志备份GETDATE()

RESTORE LOG splunk FROM DISK = 'c:\temp\sp_tail.trn' 
  WITH NORECOVERY, STOPAT = '<paste GETDATE() output from above>';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

消息 4335,级别 16,状态 1
指定的 STOPAT 时间过早。数据库的全部或部分已经在该点之后前滚。
消息 3013,级别 16,状态 1
RESTORE LOG 异常终止。

为了恢复到某个时间点,您需要在一次完整备份之后(不一定在上次完整备份之后,而是在有效且可以恢复的一次之后)进行至少一次事务日志备份,并且在该点之后及时恢复到(但在下一次完整数据库备份之前)。

这就是为什么我们通常每晚或每周进行一次完整备份,每 15 分钟或每小时进行一次事务日志备份(有时也会进行差异/文件组备份,具体取决于业务需求、RTO/RPO 等)。在完整恢复模式中,肯定没有您希望每周进行一次完整备份的用例,并且两者之间没有任何备份。以艰苦的方式学习这可能是一个非常昂贵的课程,但我敢打赌它不会发生在你身上两次。

这篇文章可能有很多关于备份的有用要点,我们为什么要使用它们,日志备份的用处等等。 - 我强烈建议将它加入书签,并在您解决当前问题后通读一遍。