对于我的 SQL Server 2005 备份计划,我想在周日做一个完整的:
BACKUP DATABASE myDatabase TO DISK = 'D:\Database Backups\myDatabase_full.bak' WITH FORMAT
GO
然后我想在本周剩下的时间里每晚做一次差异化:
BACKUP DATABASE myDatabase TO DISK = 'D:\Database Backups\myDatabase_Diff.bak' WITH DIFFERENTIAL
GO
我的假设是,如果数据库中的活动很少/没有活动,那么差异的大小不会增加(或不会增加太多)。
但是,当我运行上面的差异备份(很少或没有活动)时,我看到差异备份一次增加了 megs。为什么会这样增长?
谢谢
有些东西正在改变你的数据库!
诸如索引重建或碎片整理之类的事情会导致页面更改。回滚的更改可能已经更改了页面,因此它们也算在内。
此外,差异备份被认为是“模糊的”,因此备份中会包含事务日志数据,这需要保持一致性。
Paul Randal 不久前写了一个非常酷的脚本,它会告诉您自上次完整备份以来改变了多少范围,因此您可以使用它来计算差异有多大。
此外,您应该能够使用此脚本来告诉您 db 中哪些页面发生了更改。这可以帮助您解决不断变化的数据之谜。
请记住,差异与增量不同。例如,如果您有一个 100MB 的数据库,并进行了 5MB 的更改,那么每个差异备份将至少为 5MB。使用增量时,如果您有一个 100MB 的数据库,并且在星期一进行了 5MB 的更改,而在星期二没有更改,那么您将拥有 100MB 的完整备份、星期一的 5MB 增量备份以及星期二的 1MB 以下的小备份。
对于差异备份,如果您有 100MB 的数据库,并且在接下来的 4 天内进行了 5、1、3 和 5MB 的更改,那么您将获得 5、6、9 和 14MB 的差异备份。
您完全确定该数据库上没有任何活动吗?也许您可以运行分析器来查看是否发生了您未预料到的任何事情,并检查维护计划或计划任务是否有任何可能正在修改数据的事情。
也就是说……我意识到我没有真正的答案。我在一个特定数据库 (~6GB) 上所做的每日差异总是在周末增加,即使理论上没有人登录使用该数据库的应用程序也是如此。我没有费心去研究它,因为我知道该服务器上有一些服务偶尔会按需读取/写入该数据库,尽管这种情况很少见。
差异备份会备份已“触及”的 8K 页。
如果您的所有更改都很小并且在同一区域,那么您将有一个小备份。这是不太可能的。
如果您继续弄脏相同的页面,差异备份可能不会增长(也不太可能)
一些会弄脏页面的东西:
我(基本上是一名 java 开发人员)面临同样的问题,即我的实时数据库为 7.5 GB,其每天的差异备份为 1.5 GB。(实际上我们将 diff 备份 1 小时)当我兰迪的脚本半天(即在午餐时间,这是一个完整工作日的一半)时,我得到以下输出:
总变化百分比 125658 17169 13.66
我确信这是一个旧应用程序,很少有人使用它,但是对于这样一个使用较少的应用程序,这怎么可能显示 17169 个更改的范围,这导致:17169 * 64k => 1098.816 MB(接近 1GB 差异)。请分享您对此的想法...我该如何进一步调试?我的意思是如何进一步缩小范围以获得小的差异。