了解与完整备份和日志备份相关的 Ola Hallengren 的 SQL Server 脚本中的 CleanupTime

Wou*_*ter 9 sql-server backup sql-server-2016 ola-hallengren

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

具体来说:

我正在做每周完整备份、每日 DIFF 备份和每小时日志备份。完整备份使用默认值CleanupTime24 小时。DIFF 和 LOG 备份的 NULL 为CleanupTime

CleanupTime 参数文档中,我无法理解是否设置FULLCleanupTime备份的设置BackupType也会删除旧的 DIFF 和 LOG 备份文件,或删除FULL 备份文件。

指定删除备份文件之前的时间(以小时为单位)。如果未指定时间,则不会删除任何备份文件。

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

DatabaseBackup 有一个检查来验证比最近的完整或差异备份更新的事务日志备份没有被删除。

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

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

Joh*_* N. 22

@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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • @CurrentDirectoryPath
  • @CurrentFileExtension
  • @CurrentCleanupDate

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

INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
    SELECT DATEADD(hh,-(@CleanupTime),GETDATE()), 0

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

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

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

所以你有它。

概括

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

@CurrentCommand02那得到执行基本上是:

xp_delete_file 0, 'F:\SQLBACKUP', 'BAK', '2018-08-20 20:00:00.045'
Run Code Online (Sandbox Code Playgroud)

所以它不涉及任何其他备份文件。(当然除非你已经定义'BAK'了所有备份类型的扩展,在这种情况下你就输了)。


Sco*_*red 9

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

如果您符合以下条件,它可能会帮助您(因为它帮助我)完全了解脚本的工作原理:

  1. 在测试实例上安装备份脚本(和其他依赖项) - 我在本地计算机上进行了测试。
  2. 现在,更改脚本并搜索/替换hhminute. 我能找到的唯一参考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'
Run Code Online (Sandbox Code Playgroud)

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

满的

每次执行FULL备份都会创建一个新FULL备份并删除所有FULL超过 1 分钟的备份文件。没有DIFFLOG备份文件受到影响。

差异化

每次执行DIFF备份都会创建一个新DIFF备份并删除所有DIFF超过 1 分钟的备份文件。没有FULLLOG备份文件受到影响。

日志

每次执行LOG备份都会创建一个新LOG备份。连续LOG备份(没有干预FULLDIFF备份)只是继续在LOG备份文件夹中累积,而不考虑清理时间。如果一个FULLDIFF备份最终采取了在下次运行LOG备份删除任何LOG比最新的旧备份FULLDIFF也超过1分钟以上。

运行备份时没有FULLDIFF备份文件受到影响LOG


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

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

  • 运行FULL备份永远不会删除DIFFLOG备份
  • 运行DIFF备份永远不会删除FULLLOG备份
  • 运行LOG备份永远不会删除FULLDIFF备份