sql-server – 为什么差异备份不能指定其基础?

前端之家收集整理的这篇文章主要介绍了sql-server – 为什么差异备份不能指定其基础?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的第一篇DBA.SE帖子,所以请告诉我任何错误,谢谢!

我是一名新的DBA(不是IT专业人员,公司里没有其他人这样做),所以解释越基本越好.我一直在阅读有关数据库备份策略的文章(或者,正如我学会称之为“恢复策略”).我了解完整,差异和事务日志备份的功能,但我想知道为什么差异备份只能基于最新的完整备份.

如果差异备份是自上次完全备份以来已更改的所有内容,那么为什么差异不能基于我选择的任何备份?更清楚的是,我要求在进行备份时指定基数,而不是在恢复时.我假设在恢复时你会选择正确的基础和相应的差异来执行恢复(不使用从基础B制造的差异从基础A恢复).

是什么原因导致无法阻止此功能?我认为必须有一个原因,我只是不知道它是什么.

注意:我理解基础不能指定,但我的问题是为什么不呢? (我对“你为什么会这样?”的讨论也不感兴趣.)

比喻

这是我理解差异备份的类比:

我有一个Excel文件,其中有一些数据在单元格中.

在第1天,我制作了这个文件的副本并将其存储在其他地方(“完整备份”).

在第2天,我查看该文件并将其与我在第1天制作的备份副本进行比较,并记下所有已更改的单元格以及它们的新值(“差异备份”).我并没有注意到对细胞所做的每一次改变,只是它的最终价值.如果单元格A1开始为“阿尔弗雷德”,改为“贝蒂”,“查理”,然后是“戴夫”,我只会注意到“A1现在是戴夫”.

在第3天,我再次将当前文件与备份文件进行比较并记录更改(另一个“差异备份”与第2天具有相同的基础).同样,仅注意观察到的每个细胞的最终值,而不是细胞在一天中所有的值.

在第4天,我再次比较并再次注意更改.继续单元格A1,现在它说“莎拉”,即使它是全天其他10个名字,我注意到的是“现在A1是莎拉”.

在第5天,我的文件搞砸了;所以,我查看我在第1天制作的备份副本,然后是第4天注意到的最终状态,然后我将备份副本中注明的更改应用到现在,我将文件“恢复”到第4天的状态所以,我看看第1天做的备份,看到第4天的单元格A1以“Sarah”结束,并将备用单元格A1更改为“Sarah”.

如果我在第2天制作了另一份文件的备份副本(“完整”),为什么会这么重要?为什么还不可能在第3天或第4天将文件与第1天的副本进行比较(读取,“取差异备份”)?据我了解,sql Server需要我比较(当进行另一个差异备份时)到第2天进行的完整备份(如果已经完成) – 没有其他选择.

解决方法

差异备份使用所谓的 differential change map来构建自上次完全备份以来已修改pages列表.此列表是“差异”列表,因此是备份类型的名称,以及只能在关联的完整备份之上还原备份的原因.

执行完整备份会重置差异更改映射.从那时起,任何被修改页面都会记录在地图中.如果您随后获取差异,则该备份仅包含自上次完全备份以来已修改页面,并记录在映射中.

在您的类比中,作为整个恢复过程基础的两个完整备份可能具有不同的内容,因此可能具有不同的差异映射.如果基于第二个备份上的第一个备份还原差异,则数据库可能已损坏.事实上,sql Server阻止了对除了基于它的原始完整备份之外的任何内容的差异备份的恢复.

当您要求sql Server进行差异备份时,差异的唯一“基础”是差异备份开始时数据库中存在的单个差异更改映射.这就是您无法为差异备份指定基础的原因.

回应@MartinSmith的评论 – 您可以使用COPY_ONLY backups在多个完整备份上恢复差异备份.请考虑以下情形:

> BACKUP DATABASE xyz TO DISK =’path_to_backup.bak’;
> BACKUP DATABASE xyz TO DISK =’path_to_backup_2.bak’WITH COPY_ONLY;
> BACKUP DATABASE xyz TO DISK =’path_to_backup_3.bak’with COPY_ONLY;
> BACKUP DATABASE xyz TO DISK =’path_to_backup_4.bak’with COPY_ONLY;
> BACKUP DATABASE xyz TO DISK =’path_to_backup_diff.bak’with DIFFERENTIAL;

步骤5中的差异备份应该能够在步骤1到4中执行的任何备份上恢复,因为差异更改映射仅在步骤1中的完全备份发生时被清除.步骤2,3和4中的COPY_ONLY备份不会重置更改映射.由于差异更改映射会累积自完全备份以来所做的更改,因此每个连续的COPY_ONLY备份都包含足够的信息,以便差异备份可用于以前的4个备份中的任何一个.

虽然看起来它应该可行,但实际上,在copy_only备份的顶部恢复差异会导致以下错误

Msg 3136,Level 16,State 1,Line 1
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Msg 3013,Line 1
RESTORE DATABASE is terminating abnormally.

我已经创建了一个用于测试差异和copy_only恢复的sql Server 2012平台repro,并将文件保存在gist.github.com – 警告脚本将删除任何名为RestoreTest的数据库作为其第一步.

猜你在找的MsSQL相关文章