完整备份后如何减少事务日志备份大小?

Dav*_*e D 38 sql-server sql-server-2005

我设置了三个维护计划以在 Sql Server 2005 实例上运行:

  • 每周数据库优化,然后是完整备份
  • 每日差异备份
  • 每小时事务日志备份

每小时的日志备份通常在几百 Kb 到 10Mb 之间,具体取决于活动水平,每日差异通常在周末增加到 250Mb 左右,每周备份约为 3.5Gb。

我遇到的问题是完整备份之前的优化似乎导致下一个事务日志备份在恢复正常之前增长到完整备份大小的 2 倍以上,在本例中为 8Gb。

除此之外BACKUP LOG <DatabaseName> WITH TRUNCATE_ONLY,是否有任何方法可以减少该日志备份的大小,或者完全防止将优化记录在事务日志中,因为它们肯定会在它们之前的完整备份中被考虑在内?

Pau*_*dal 35

这里有一些有趣的建议,这些建议似乎都显示了对日志备份如何工作的误解。日志备份包含自上次日志备份以来生成的所有事务日志,无论在此期间进行了哪些完整或差异备份。停止日志备份或移动到每日完整备份对日志备份大小没有影响。一旦日志备份链启动,唯一影响事务日志的是日志备份。

此规则的唯一例外是如果日志备份链已损坏(例如,通过进入 SIMPLE 恢复模型,从数据库快照恢复,使用 BACKUP LOG WITH NO_LOG/TRUNCATE_ONLY 截断日志),在这种情况下,第一个日志备份将包含自上次完整备份以来的所有事务日志 - 这会重新启动日志备份链;或者如果日志备份链尚未启动 - 当您第一次切换到 FULL 时,您将在一种伪简单恢复模型中运行,直到进行第​​一次完整备份。

要回答您最初的问题,无需进入 SIMPLE 恢复模型,您将不得不备份所有事务日志。根据您正在采取的操作,您可以更频繁地进行日志备份以减小其大小,或者执行更有针对性的数据库。

如果您可以发布一些有关您正在执行的维护操作的信息,我可以帮助您优化它们。您是否有机会进行索引重建,然后收缩数据库以回收索引重建使用的空间?

如果在进行维护时数据库中没有其他活动,您可以执行以下操作:

  • 确保用户活动已停止
  • 进行最后的日志备份(这允许您恢复到维护开始点)
    • 切换到 SIMPLE 恢复模式
    • 执行维护 - 日志将在每个检查点上截断
    • 切换到完整恢复模式并进行完整备份
    • 继续正常

希望这会有所帮助 - 期待更多信息。

谢谢

[编辑:在关于完整备份是否可以改变后续日志备份的大小(它不能)的所有讨论之后,我整理了一篇包含背景材料和证明它的脚本的综合博客文章。查看https://www.sqlskills.com/blogs/paul/misconceptions-around-the-log-and-log-backups-how-to-convince-yourself/]

  • 不 - 我仍然不同意。我宁愿有更频繁的日志备份,以便它们更小,而不是在所有维护完成后成为一个怪物。日志备份大小不成比例会导致在网络上复制它们时出现问题(例如,用于异地备份或日志传送)。如果没有用户活动并且不需要其他日志备份,那么*也许*,但是如果系统崩溃并且您必须进行日志尾部备份,那将需要很多时间,这是其中的一部分你的停机时间。我应该写一篇关于这个的博客文章。 (6认同)
  • 保罗 - 完全不同意。只是不要在索引维护期间进行日志备份。日志会增长,下一次完整备份会更大,但不会在索引维护作业的同时发生 t-log 备份的性能损失。你能看出它的优点吗?您肯定会同意同时进行 t-log 备份和索引维护会导致性能下降。 (4认同)

Sql*_*CID 5

您可以缩小它们,但它们只会再次增长,最终导致磁盘碎片。索引重建和碎片整理会产生非常大的事务日志。如果您不需要时间点可恢复性,您可以更改为简单恢复模式并完全取消事务日志备份。

我猜您正在使用维护计划进行优化,您可以将其更改为使用仅在达到特定碎片级别时才进行索引碎片整理的脚本,并且您可能不会遭受任何性能损失。这将生成更小的日志。

顺便说一句,我会跳过每日差异以支持每日完整备份。

  • 每个人的情况不同,差异没有什么问题,但除非空间非常宝贵,否则如果您需要快速恢复,最好一步比两步。 (2认同)