AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 12793
Accepted
Dave D
Dave D
Asked: 2009-05-28 04:23:15 +0800 CST2009-05-28 04:23:15 +0800 CST 2009-05-28 04:23:15 +0800 CST

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

  • 772

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

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

每小时的日志备份通常在几百 Kb 到 10Mb 之间,具体取决于活动级别,到周末的每日差异通常会增长到 250Mb 左右,每周备份大约是 3.5Gb。

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

除此之外BACKUP LOG <DatabaseName> WITH TRUNCATE_ONLY,还有什么方法可以减少该日志备份的大小,或者完全阻止优化记录在事务日志中,因为它们肯定会在它们之前的完整备份中得到考虑?

sql-server sql-server-2005
  • 7 7 个回答
  • 53350 Views

7 个回答

  • Voted
  1. Best Answer
    Paul Randal
    2009-05-28T08:29:35+08:002009-05-28T08:29:35+08:00

    这里有一些有趣的建议,似乎都表明对日志备份的工作方式存在误解。日志备份包含自上次日志备份以来生成的所有事务日志,无论在此期间进行了哪些完整或差异备份。停止日志备份或转向每日完整备份不会影响日志备份大小。唯一影响事务日志的是日志备份,一旦日志备份链启动。

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

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

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

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

    • 确保用户活动停止
    • 进行最终日志备份(这使您可以恢复到维护开始点)
      • 切换到简单恢复模式
      • 执行维护 - 日志将在每个检查点截断
      • 切换到完整恢复模式并进行完整备份
      • 照常继续

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

    谢谢

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

    • 35
  2. SqlACID
    2009-05-28T04:34:41+08:002009-05-28T04:34:41+08:00

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

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

    我会跳过每日差异,转而支持每日完整备份 BTW。

    • 5
  3. Brent Ozar
    2009-05-28T06:23:31+08:002009-05-28T06:23:31+08:00

    您的最后一个问题是:“除了 BACKUP LOG WITH TRUNCATE_ONLY 之外,还有什么方法可以减少该日志备份的大小,或者完全阻止优化记录在事务日志中,因为它们肯定会被完整地考虑在内备份他们之前?”

    不,但这里有一个解决方法。如果您知道当时该数据库中的唯一活动将是索引维护作业,那么您可以在索引维护开始之前停止事务日志备份。例如,我在周六晚上的一些服务器,工作时间表是这样的:

    • 晚上 9:30 - 事务日志备份运行。
    • 晚上 9:45 - 最后一次运行事务日志备份。时间表在 9:59 停止。
    • 晚上 10:00 - 索引维护作业开始并内置停止,以在 11:30 之前完成。
    • 晚上 11:30 - 完整备份作业开始并在 30 分钟内完成。
    • 12:00 AM - 事务日志备份每 15 分钟重新开始。

    这意味着我在晚上 9:45 到 11:30 之间没有时间点可恢复性,但回报是更快的性能。

    • 3
  4. Jeremy Lowell
    2009-05-28T10:46:38+08:002009-05-28T10:46:38+08:00

    简单的答案:更改您的每周优化工作,使其每晚以更平衡的方式运行。即在周日晚上重新索引表 ae,在周一晚上重新索引表等...找到一个很好的平衡,您的日志将大约是平均大小的 1/6。当然,如果您不使用内置的 ssis 索引维护作业,这种方法效果最好。

    这样做的不利之处在于它对优化器和查询计划的重用造成严重破坏,这取决于您的数据库体验的负载。

    但是,如果您只关心每周的 t-log 的大小,则将其每天或每小时拆分,并在其间运行 t-log 备份。

    • 3
  5. Steve Jones
    2009-05-28T10:05:00+08:002009-05-28T10:05:00+08:00

    您还可以使用第三方工具(Quest 的 Litespeed、Red Gate 的 SQL Backup、Hyperbac)来减小备份和日志的大小。他们可以通过节省磁带快速收回成本。

    • 2
  6. ErikE
    2009-05-28T10:37:04+08:002009-05-28T10:37:04+08:00

    您可以在数据库优化期间的各个时间点专门备份您的事务日志吗?t-logs 的总大小是相同的,但每个都会更小,可能以某种方式帮助你。

    您能否进行更有针对性的数据库优化,从而创建更少的事务(有人提到这一点,但我不确定其含义是否已阐明)。比如容忍一定数量的碎片或浪费一段时间的空间。如果 40% 的表只有 5% 的碎片,那么不碰它们可以节省相当多的活动。

    • 2
  7. Tim Ford
    2009-06-04T12:10:47+08:002009-06-04T12:10:47+08:00

    可以假设您的“优化”包括索引重建。在不会遇到大量更新和插入的数据库上,仅每周执行这些任务可能是可以接受的,但是如果您的数据高度流动,您可能需要做几件事:

    1. 如果您的日程安排允许并且影响可以接受,则每晚重建或重组您的索引。在执行这些夜间索引维护任务时,仅针对那些碎片超过 30% 用于重建和 15-30% 用于重组的索引。

    2. 这些任务是记录事务,所以如果您担心日志增长,那么我会提倡 Paul 推荐的内容。索引维护之前的最终事务日志备份,切换到简单恢复,然后进行维护过程,然后切换回完全恢复,然后进行完全数据备份应该可以解决问题。

    我对我的日志文件采取了一种类似禅宗的方法:它们是它们想要的大小。只要与我所信奉的数据库活动相比,他们没有因为糟糕的备份实践而经历异常增长。

    至于执行自由索引维护的脚本,请在线查看:那里有很多。大约一年前,Andrew Kelly 在 SQL Magazine 上发表了一篇不错的文章。SQLServerPedia 有一些来自 Michelle Ufford 的脚本,最新一期的 SQL 杂志(我相信是 2009 年 7 月)也有关于该主题的完整文章。重点是找到一个适合您的,并通过最少的自定义使其成为您自己的。

    • 2

相关问题

  • 从 MySQL 迁移到 SQL Server 的最佳方法或工具

  • 如何启用与 SQL Server 实例的加密连接?

  • Vanilla Powershell 是否足以成为 Windows 和 DB 服务器管理员的语言?

  • 在 SQL Server 中,何时应将 PRIMARY Data FileGroup 拆分为辅助数据文件?

  • 如何从 SQL Server 2008 中的备份中排除索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve