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
    • 最新
    • 标签
主页 / dba / 问题 / 215382
Accepted
Wouter
Wouter
Asked: 2018-08-21 04:42:03 +0800 CST2018-08-21 04:42:03 +0800 CST 2018-08-21 04:42:03 +0800 CST

了解 Ola Hallengren 的 SQL Server 脚本中与 FULL 备份和 LOG 备份相关的 CleanupTime

  • 772

我无法理解Ola Hallengren 服务器维护解决方案CleanupTime中的选项究竟有什么期望。我正在寻找一些相关的问题和详尽的答案,但这些解释仍然让我有些困惑。

具体来说:

我每周进行一次 FULL 备份、每日 DIFF 备份和每小时 LOG 备份。FULL 备份使用默认CleanupTime的 24 小时。DIFF 和 LOG 备份的 NULL 为CleanupTime.

从CleanupTime 参数的文档中,我无法理解是否将CleanupTime设置设置为BackupTypeFULL 备份,也会删除较旧的 DIFF 和 LOG 备份文件,或者仅删除FULL 备份文件。

指定删除备份文件的时间(以小时为单位)。如果没有指定时间,则不会删除备份文件。

后一段让我认为设置FULLCleanupTime备份BackupType也会删除旧的事务日志。然而,尚不清楚这一段是否仅适用于BackupTypeLOG 的备份,或者也适用于BackupTypeFULL 的备份。

DatabaseBackup 会检查以确认比最新的完整备份或差异备份更新的事务日志备份不会被删除。

我想要实现的是,我可以进行长达 1 周的时间点恢复。(我们有一个变化非常缓慢的数据库,所以这是可行的)按照我现在的理解,这需要一周前的完整备份和一周的事务日志备份。由于完全备份和差异备份只能用于恢复到一个特定的时间点。

那么,我应该将CleanupTime我的 FULL 备份作业的选项设置为24*7吗?我现在猜测的是,将其设置为 24 小时,将导致下一次完整备份删除所有较旧的完整、差异和事务日志备份文件,使我的时间点恢复窗口为 ... 0 小时。正确的?

sql-server backup
  • 3 3 个回答
  • 11395 Views

3 个回答

  • Voted
  1. Best Answer
    John K. N.
    2018-08-21T06:54:42+08:002018-08-21T06:54:42+08:00

    @CleanupTime始终为特定备份作业指定。例如,如果您创建完整备份作业、差异备份作业和事务日志备份作业,则@CleanupTime始终与作业的扩展相关。

    让我们看一个完整备份示例。

    完全备份

    如果您创建完整备份作业,则通常会添加以下一个或多个参数:

    • @Databases: 备份哪些数据库(与此示例无关)
    • @Directory: 存放备份的目录
    • @BackupType: 全, 差分, TLog
    • @CleanupTime: 要保留多少小时的备份
    • @FileExtensionFull:备份的扩展名。

    因此,您有一个备份作业,它将根据您为 at 作业定义的计划创建完整备份。让我们假设以下内容:

    • 此作业在 20:00(晚上 8 点)运行
    • @FileExtensionFull已设置为'BAK'
    • @Directory已设置为'F:\SQLBACKUP'
    • @CleanupTime已设置为24(小时)

    如果我们查看该MaintenanceSolution.sql文件,您将找到参数的描述:

    SET @CleanupTime         = NULL         
    -- Time in hours, after which backup files are deleted. If no time is specified, then no backup files are deleted.
    

    嗯,这没有多大帮助。与网站上的官方文档相同。让我们进一步挖掘。如果您浏览脚本,您最终会找到如下所示的部分:

    脚本已被包装以增加可读性

    如果 @BackupSoftware 为空
        开始
            SET @CurrentCommandType02 = 'xp_delete_file'
            设置@CurrentCommand02 =
                '声明@ReturnCode int
                执行@ReturnCode = [master].dbo.xp_delete_file 0,
                    N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''', -- 第一个参数
                    ''' + @CurrentFileExtension + ''', --第二个参数
                    ''' + CONVERT(nvarchar(19),@CurrentCleanupDate,126) + ''' -- 第三个参数
            IF @ReturnCode 0 RAISERROR(''删除文件出错。'', 16, 1)'
        结尾
    

    所以 Ola 基本上是利用 SQL Server 的内置xp_delete_file function在某个时间删除一个文件根据:

    • @CurrentDirectoryPath
    • @CurrentFileExtension
    • @CurrentCleanupDate

    但是等等,例如,@CurrentCleanupDate是什么?如果我们在脚本中返回一点,您可以找到如下所示的部分:

    插入@CurrentCleanupDates(CleanupDate,镜像)
        选择 DATEADD(hh,-(@CleanupTime),GETDATE()), 0
    

    啊,所以是从和 当前时间@CurrentCleanupDate计算的日期加法。凉爽的。(......我们可能刚刚在代码中发现了一个错字,因为普通数据库和镜像数据库的部分都包含在代码中。)@CleanupTimeGETDATE()
    Mirror

    那么相关部分是做什么用的@CurrentFileExtension呢?让我们再搜索一下。我们发现:

    选择 @CurrentFileExtension = 案例
        当@CurrentBackupType = 'FULL' 那么@FileExtensionFull
        当@CurrentBackupType = 'DIFF' 那么@FileExtensionDiff
        当@CurrentBackupType = 'LOG' 那么@FileExtensionLog
        结尾
    

    所以你有它。

    概括

    如果您的完整备份作业的参数设置为@FileExtensionFull='BAK'并且您设置了 a,@CleanupTime=24则该过程将删除至少一天(24 小时)之前的所有完整备份文件。

    被执行的@CurrentCommand02基本上是:

    xp_delete_file 0, 'F:\SQLBACKUP', 'BAK', '2018-08-20 20:00:00.045'
    

    所以它不会触及任何其他备份文件。(当然,除非您已定义'BAK'为所有备份类型的扩展,在这种情况下您会丢失)。

    • 25
  2. Scott Hodgin - Retired
    2018-08-21T07:10:07+08:002018-08-21T07:10:07+08:00

    我赞成@hot2use 的回答,因为它详细介绍了这个问题,但我确实想分享一种简单的方法来测试这些东西。

    如果您:

    1. 在测试实例上安装备份脚本(和其他依赖项) - 我在本地计算机上进行了测试。
    2. 现在,更改脚本并搜索/替换hh为minute. 我能找到的唯一参考hh是脚本处理清理时间的地方。这使您可以快速运行各种类型的备份(FULL、DIFF、LOG)查看执行的效果,因为保留时间是几分钟而不是几小时。

    运行测试数据库的 FULL、DIFF 和 LOG 备份,并记下在各个文件夹中创建的文件。这是我使用的(注意CleanupTime1 分钟,因为将脚本从几小时更改为几分钟):

    exec [dbo].[DatabaseBackup]
    @Databases = 'test',
    @Directory = 'C:\OlaBackupTest',
    @BackupType = 'full',
    @Verify = 'N',
    @CleanupTime = 1,
    @CleanupMode = 'AFTER_BACKUP'
    
    exec [dbo].[DatabaseBackup]
    @Databases = 'test',
    @Directory = 'C:\OlaBackupTest',
    @BackupType = 'diff',
    @Verify = 'N',
    @CleanupTime = 1,
    @CleanupMode = 'AFTER_BACKUP'
    
    exec [dbo].[DatabaseBackup]
    @Databases = 'test',
    @Directory = 'C:\OlaBackupTest',
    @BackupType = 'log',
    @Verify = 'N',
    @CleanupTime = 1,
    @CleanupMode = 'AFTER_BACKUP'
    

    我的测试揭示了以下观察结果:

    满的

    每次执行FULL备份都会创建一个新FULL备份并删除任何FULL早于 1 分钟的备份文件。没有DIFF或LOG备份文件受到影响。

    差异

    每次执行DIFF备份都会创建一个新DIFF备份并删除任何DIFF早于 1 分钟的备份文件。没有FULL或LOG备份文件受到影响。

    日志

    每次执行LOG备份都会创建一个新LOG备份。连续LOG备份(没有干预FULL或DIFF备份)只是继续累积在LOG备份文件夹中,而不考虑清理时间。如果最终进行了备份,则备份的 NEXT 运行会FULL删除任何早于最新或早于 1 分钟的备份。DIFFLOGLOGFULLDIFF

    运行备份时没有FULL或DIFF备份文件受到影响LOG。


    我建议您保留 1 周以上的FULL备份,以防您需要及时返回进行恢复。假设 2 周的FULL备份,您需要CleanupTime336 小时。

    在您测试 1 分钟内容的过程中,您会看到:

    • 运行FULL备份永远不会删除DIFF或LOG备份
    • 运行DIFF备份永远不会删除FULL或LOG备份
    • 运行LOG备份永远不会删除FULL或DIFF备份
    • 9
  3. Daniel
    2020-03-24T04:17:14+08:002020-03-24T04:17:14+08:00

    扩展其他两个答案,因为我刚刚遇到了这个:

    可能值得注意(对任何可以谷歌搜索的人)。允许比您想要保留备份的确切时间多一点。

    如果 op 想要保留 1 周前的备份,则 24x7 小时不会总是保留 1 周前的文件。原因:数据库正在增长。您的新备份可能需要更长的时间。

    如果您的第一个备份文件是在 2020-03-15 03:00:05.000 创建的并且下一个备份需要更长的时间并且文件是在 2020-03-22 30:00:0 6 .000 创建的 - 这比指定的要多168 小时(一秒,请注意)

    所以为了安全起见,让它 24x7+1!

    • 1

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

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

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve