Sql-Server

了解 Ola Hallengren 的 SQL Server 腳本中與 FULL 備份和 LOG 備份相關的 CleanupTime

  • March 23, 2020

我無法理解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 小時。對?

@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計算的日期加法。涼爽的。(……我們可能剛剛在程式碼中發現了一個錯字,因為普通數據庫和鏡像數據庫的部分都包含**在程式碼中。)@CleanupTime``GETDATE()

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'為所有備份類型的擴展,在這種情況下您會失去)。

引用自:https://dba.stackexchange.com/questions/215382