关于 SQL 服务器 backup/restore 的澄清要点

Points of clarification regarding SQL Server backup/restore

我正在了解 SQL 服务器 backup/restore 选项。不是 class 之类的,而是因为我最近意识到我面前的那个人设置起来效率很低。例如,full 每天备份 运行 一次,t运行saction 每小时备份 运行 一次。所有这些都是通过工作而不是维护计划完成的。在研究如何改进我工作的设置时,我学到了很多东西,但也卡在了几点上。我希望确认我认为我知道的内容,并澄清我尚未完全掌握的内容。提前致谢!

据我了解,完整备份就是对数据库文件中的每一位进行完整备份,包括 t运行saction 日志,直至备份开始。差异备份是一回事,但只包含自上次执行完整备份或差异备份以来所做的更改。这些通常 运行 每天一次左右,而完整备份 运行 每周一次左右。

第一个问题:系统如何知道最后一次备份发生的时间?数据库中的标志?它是否打开并查看备份目标文件?每当备份 运行s 并且没有失败时,它是否在内部设置?

T运行saction 备份让我有点困惑。我知道这种类型会备份从上次 full/differential 备份到当前时刻的 t运行saction 日志,但是 "tail log" 是什么?我在文档中看到它被引用,据我所知,它只是从最近备份到 "now" 的 t运行saction 日志。如果我的数据库在备份后七分钟失败,我需要担心七分钟的尾日志,对吗?

我要恢复我失败的数据库,具体怎么做?假设它在周二 3:41 下午失败。我的完整备份 运行 是上周六 2:00 上午,我的差异备份 运行 发生故障的早上 5:00 上午,我的 t运行saction 备份 运行 每十五分钟一次,所以我在那个星期二 3:30 之前有很好的数据。我的备份都转到本地服务器进行存储,称之为 \backups。因此,我的文件位于 \backups\sql\full、\backups\sql\differential 和 \backups\sql\transaction_logs.

我对第二个问题的猜测是先让失败的数据库脱机,然后像我过去所做的那样恢复完整备份。接下来我会再次进行还原,但这次从差异备份中选择文件。最后,我要重复一遍,这次使用 t运行saction 备份恢复到 3:30。我会丢失十一分钟的数据,但我认为我别无选择。或者我可以从 t运行saction 备份开始,看看它是否正确恢复,而 'full restore first' 想法最适合移动数据库?

关于自动备份我们所有的数据库,还有什么我应该知道的吗?有些非常大,我们需要确保我们有尽可能可靠的备份计划。我非常感谢任何人对这一切的任何意见。

A differential backup is the same thing, but only encompasses changes made since the last full or differential backup was performed.

没有。差异仅是自上次执行完整备份以来发生的变化。作为 segue,数据库如何通过在称为差异页面映射的特殊数据库页面中跟踪它们来知道差异备份中包含的内容。这些页面会在完整备份时重置。

你关于 "what is a tail log?" 的另一个问题,它只是数据库中尚未备份的日志部分。

顺便说一句,关于备份类型的元数据存储在 msdb.dbo.backup* 表中。

一般来说,恢复序列如下所示:

  1. (可选)使用 backup log «your database name» with norecovery; 进行尾日志备份 这将使您的数据库脱机(从技术上讲,它使其处于恢复状态)。如果您处于数据库已关闭的状态,这是为了在您进行恢复之前尝试获取最后一点注销。
  2. 恢复最新的完整备份,即在您要恢复到的时间点之前。确保包含 with norecovery 子句,以便恢复语句不会也 运行 崩溃恢复,从而使进一步的恢复无法在不从头重新启动的情况下进行。
  3. 恢复你想要恢复到的时间点之前的最新差异备份。如果您上次进行了完整备份并且尚未进行差异备份,则可能有 none(这没关系)。确保包含 with norecovery 子句,以便恢复语句不会也 运行 崩溃恢复,从而使进一步的恢复无法在不从头重新启动的情况下进行。
  4. 恢复从差异开始时间到您要恢复到的时间点的所有日志文件(如果您这样做,包括您首先进行的尾日志备份)。确保包含 with norecovery 子句,以便恢复语句不会也 运行 崩溃恢复,从而使进一步的恢复无法在不从头重新启动的情况下进行。
  5. 最后,执行 restore «your database name» with recovery; 以开始崩溃恢复。

您可以使用相同的过程还原到另一台服务器。您可能必须在完整文件的还原中包含可选子句,例如 move «logical file» to «new location»replace,并且您可能不会进行尾日志备份。但是所有的大笔画都是一样的。

至于如何更好地做到这一点的建议,我不会重新发明轮子。我会(并且已经并将继续)使用 Ola Hallengren here 免费提供的备份解决方案("as in beer" 和 "as in speech")。它做一些聪明的事情,比如:

  • 为文件添加时间戳
  • 将不同类型的备份文件放在不同的目录中
  • 将数据库视为逻辑组(即 USER_DATABASES、SYSTEM_DATABASES),因此您不必维护准确的列表。也就是说,它几乎总是会做正确的事情。
  • 正确处理日志 shipped/availability 组数据库
  • 在差异备份中,如果尚未进行完整备份(例如,如果将新数据库添加到服务器),可选择进行完整备份
  • 这么多

说真的,检查一下。我最后的建议是练习直到你感冒了。在紧急情况下,您最不想做的就是阅读手册以弄清楚如何去做。