我很确定我知道这个问题的答案,但是时间点恢复的局限性让我大吃一惊。
假设我有一个 2TB 的数据库设置为FULL
恢复模式。我努力每周进行一次完整备份,每天进行一次差异备份,并每 30 分钟进行一次日志备份。
现在,我想将数据库回滚到 1 小时前。我真的必须恢复一小时前的整个完整备份、差异和日志吗?我是否正确,这将需要很长时间?
有没有办法ROLLBACK
使用事务日志文件进行更改,以便这种类型的恢复需要几分钟?
我很确定我知道这个问题的答案,但是时间点恢复的局限性让我大吃一惊。
假设我有一个 2TB 的数据库设置为FULL
恢复模式。我努力每周进行一次完整备份,每天进行一次差异备份,并每 30 分钟进行一次日志备份。
现在,我想将数据库回滚到 1 小时前。我真的必须恢复一小时前的整个完整备份、差异和日志吗?我是否正确,这将需要很长时间?
有没有办法ROLLBACK
使用事务日志文件进行更改,以便这种类型的恢复需要几分钟?
是的,您必须还原完整备份、最多一个差异备份以及所有必要的日志备份,以在 SQL Server 中执行时间点恢复。在 SQL Server 中,您无法回滚已提交的事务以及时返回。您可能希望使用该
STOPAT
语法将数据库恢复到所需的确切时间点。事实上,因为您每 30 分钟进行一次事务日志备份,SQL Server 也会在每次日志备份时清除事务日志——所以回到一个小时前,SQL Server 甚至没有必要的信息来滚动回溯到那时,即使 SQL Server 有这样的功能(遗憾的是它没有)。
我无法回答是否需要“很长时间”,因为恢复时间会根据数据库的大小、日志/差异备份中包含多少更改以及需要多少日志备份而有很大差异恢复。对于不是很忙的小型数据库,恢复可能很快,但对于非常繁忙的数 TB 数据库,可能需要一段时间。
Oracle 有一个称为Flashback的功能,可以让您按照您的描述进行操作,但 SQL Server 没有等效的功能。
您可以根据您的用例考虑使用SQL Server 快照功能。当我想重置数据库以匹配特定的测试开始条件时,我会在运行生产部署之前和在非生产环境中使用该功能。由于它利用稀疏文件,只复制修改过的页面来维护快照,并允许您在特定时间点维护 1+ 个快照,因此它们非常有效,尤其是在跟踪 VLDB 设置中的微小变化时。需要警惕的一件事是被修改的页面数量,因为它们会相应地增加稀疏文件的大小,如果稀疏文件所在的空间不足,可能会发生中断。
简而言之,是的。
您将需要恢复上次完整备份、最新差异备份以及自上次差异备份以来的所有日志备份。
这就是当数据库变得太大时,我们通常会要求开发团队清除旧数据(超过保留期)的原因。有时您没有清除的选项,必须处理它。
为了更好地准备,请始终在测试环境中进行恢复数据库的练习,这将为您提供粗略的估计。进一步估计,可以就 RTO 达成一致。
关于为什么不能回滚,有几个很好的答案1和2 。在@AMtwo 的回答中,有一些关于恢复速度的讨论。我想对此进行扩展并解决您标题中的问题。
因为您必须恢复完整备份,并且至少有一个时间点 (PIT) 恢复的 t-log,所以 PIT 始终需要至少与完整恢复一样长的时间。
通常采用差异备份来节省存储备份的空间。如果您的系统没有太多变化,这些通常比完整备份小得多。具有 6 个差异和一周价值的 t-log 的单个完整备份通常比 7 个完整备份加上 t-log 占用的空间要少得多。
差异绝对需要完整备份,首先要恢复。
如果你愿意,你可以跳过差异,恢复完整备份和所有 t-log 备份,直到你的 PIT
stopat
我定期进行备份测试,最大的障碍之一是将旧备份从安全位置(磁带、异地存储等)移动到服务器的时间。这因您的设计而异。只有您的企业才能知道这个时间是什么。
一旦备份在服务器上,它们将被恢复到;最终,完全恢复和 PIT 之间的恢复时间差会根据发生的变化量而有所不同。
根据我进行 100 次 PIT 恢复的经验,PIT 超过完整的额外时间是很小的,几秒钟或一分钟。如果您将完整、差异和所有 t-logs 放在一个文件夹中,并使用 GUI 进行还原(SQL 2012+),选择全部,它会自动对它们进行排序,并还原到您的 PIT,没有太多困难或增加时间。
TL:DR除了一些特定于您的业务和设计的变量之外。服务器时间点恢复与完全恢复所用的时间大致相同。
不能保证以前的事务仍然会在活动事务日志中,特别是如果您每 30 分钟备份一次。不幸的是,您必须恢复最新的完整版本,然后是最新的差异,然后是自该差异以来采取的所有事务日志备份。