我无法理解Ola Hallengren 服务器维护解决方案CleanupTime
中的选项究竟有什么期望。我正在寻找一些相关的问题和详尽的答案,但这些解释仍然让我有些困惑。
具体来说:
我每周进行一次 FULL 备份、每日 DIFF 备份和每小时 LOG 备份。FULL 备份使用默认CleanupTime
的 24 小时。DIFF 和 LOG 备份的 NULL 为CleanupTime
.
从CleanupTime 参数的文档中,我无法理解是否将CleanupTime
设置设置为BackupType
FULL 备份,也会删除较旧的 DIFF 和 LOG 备份文件,或者仅删除FULL 备份文件。
指定删除备份文件的时间(以小时为单位)。如果没有指定时间,则不会删除备份文件。
后一段让我认为设置FULLCleanupTime
备份BackupType
也会删除旧的事务日志。然而,尚不清楚这一段是否仅适用于BackupType
LOG 的备份,或者也适用于BackupType
FULL 的备份。
DatabaseBackup 会检查以确认比最新的完整备份或差异备份更新的事务日志备份不会被删除。
我想要实现的是,我可以进行长达 1 周的时间点恢复。(我们有一个变化非常缓慢的数据库,所以这是可行的)按照我现在的理解,这需要一周前的完整备份和一周的事务日志备份。由于完全备份和差异备份只能用于恢复到一个特定的时间点。
那么,我应该将CleanupTime
我的 FULL 备份作业的选项设置为24*7
吗?我现在猜测的是,将其设置为 24 小时,将导致下一次完整备份删除所有较旧的完整、差异和事务日志备份文件,使我的时间点恢复窗口为 ... 0 小时。正确的?
@CleanupTime
始终为特定备份作业指定。例如,如果您创建完整备份作业、差异备份作业和事务日志备份作业,则@CleanupTime
始终与作业的扩展相关。让我们看一个完整备份示例。
完全备份
如果您创建完整备份作业,则通常会添加以下一个或多个参数:
@Databases
: 备份哪些数据库(与此示例无关)@Directory
: 存放备份的目录@BackupType
: 全, 差分, TLog@CleanupTime
: 要保留多少小时的备份@FileExtensionFull
:备份的扩展名。因此,您有一个备份作业,它将根据您为 at 作业定义的计划创建完整备份。让我们假设以下内容:
@FileExtensionFull
已设置为'BAK'
@Directory
已设置为'F:\SQLBACKUP'
@CleanupTime
已设置为24
(小时)如果我们查看该
MaintenanceSolution.sql
文件,您将找到参数的描述:嗯,这没有多大帮助。与网站上的官方文档相同。让我们进一步挖掘。如果您浏览脚本,您最终会找到如下所示的部分:
脚本已被包装以增加可读性
所以 Ola 基本上是利用 SQL Server 的内置
xp_delete_file function
在某个时间删除一个文件根据:@CurrentDirectoryPath
@CurrentFileExtension
@CurrentCleanupDate
但是等等,例如,
@CurrentCleanupDate
是什么?如果我们在脚本中返回一点,您可以找到如下所示的部分:啊,所以是从和 当前时间
@CurrentCleanupDate
计算的日期加法。凉爽的。(......我们可能刚刚在代码中发现了一个错字,因为普通数据库和镜像数据库的部分都包含在代码中。)@CleanupTime
GETDATE()
Mirror
那么相关部分是做什么用的
@CurrentFileExtension
呢?让我们再搜索一下。我们发现:所以你有它。
概括
如果您的完整备份作业的参数设置为
@FileExtensionFull='BAK'
并且您设置了 a,@CleanupTime=24
则该过程将删除至少一天(24 小时)之前的所有完整备份文件。被执行的
@CurrentCommand02
基本上是:所以它不会触及任何其他备份文件。(当然,除非您已定义
'BAK'
为所有备份类型的扩展,在这种情况下您会丢失)。我赞成@hot2use 的回答,因为它详细介绍了这个问题,但我确实想分享一种简单的方法来测试这些东西。
如果您:
hh
为minute
. 我能找到的唯一参考hh
是脚本处理清理时间的地方。这使您可以快速运行各种类型的备份(FULL、DIFF、LOG)查看执行的效果,因为保留时间是几分钟而不是几小时。运行测试数据库的 FULL、DIFF 和 LOG 备份,并记下在各个文件夹中创建的文件。这是我使用的(注意
CleanupTime
1 分钟,因为将脚本从几小时更改为几分钟):我的测试揭示了以下观察结果:
满的
每次执行
FULL
备份都会创建一个新FULL
备份并删除任何FULL
早于 1 分钟的备份文件。没有DIFF
或LOG
备份文件受到影响。差异
每次执行
DIFF
备份都会创建一个新DIFF
备份并删除任何DIFF
早于 1 分钟的备份文件。没有FULL
或LOG
备份文件受到影响。日志
每次执行
LOG
备份都会创建一个新LOG
备份。连续LOG
备份(没有干预FULL
或DIFF
备份)只是继续累积在LOG
备份文件夹中,而不考虑清理时间。如果最终进行了备份,则备份的 NEXT 运行会FULL
删除任何早于最新或早于 1 分钟的备份。DIFF
LOG
LOG
FULL
DIFF
运行备份时没有
FULL
或DIFF
备份文件受到影响LOG
。我建议您保留 1 周以上的
FULL
备份,以防您需要及时返回进行恢复。假设 2 周的FULL
备份,您需要CleanupTime
336 小时。在您测试 1 分钟内容的过程中,您会看到:
FULL
备份永远不会删除DIFF
或LOG
备份DIFF
备份永远不会删除FULL
或LOG
备份LOG
备份永远不会删除FULL
或DIFF
备份扩展其他两个答案,因为我刚刚遇到了这个:
可能值得注意(对任何可以谷歌搜索的人)。允许比您想要保留备份的确切时间多一点。
如果 op 想要保留 1 周前的备份,则 24x7 小时不会总是保留 1 周前的文件。原因:数据库正在增长。您的新备份可能需要更长的时间。
如果您的第一个备份文件是在 2020-03-15 03:00:05.000 创建的并且下一个备份需要更长的时间并且文件是在 2020-03-22 30:00:0 6 .000 创建的 - 这比指定的要多168 小时(一秒,请注意)
所以为了安全起见,让它 24x7+1!