Ola Hallengren Server Maintenance Solution のCleanupTime
オプションに何が期待できるかを正確に理解できません。私はいくつかの関連する質問と精巧な答えを見つけていますが、説明はまだ私を少し困惑させます。
具体的には:
毎週のフルバックアップ、毎日のDIFFバックアップ、および毎時のLOGバックアップを実行しています。完全バックアップでは、デフォルトのCleanupTime
の24時間を使用しています。 DIFFおよびLOGバックアップには、CleanupTime
としてNULLがあります。
CleanupTimeパラメータのドキュメント から、CleanupTime
FULLのバックアップにBackupType
設定を設定すると、古いDIFFおよびLOGバックアップファイルも削除されるかどうか理解できません、またはonly完全バックアップファイル。
バックアップファイルが削除されるまでの時間を時間単位で指定します。時間を指定しない場合、バックアップファイルは削除されません。
後者の段落では、CleanupTime
FULLのバックアップにBackupType
を設定すると、古いトランザクションログも削除されると思います。しかし、この段落がBackupType
LOGのバックアップにのみ適用されるのか、それともBackupType
FULLのバックアップにのみ適用されるのかは明確ではありません。
DatabaseBackupには、最新の完全バックアップまたは差分バックアップよりも新しいトランザクションログバックアップが削除されていないことを確認するチェック機能があります。
私が達成しようとしているのは、1週間までのポイントインタイムリカバリを実行できることです。 (データベースは非常にゆっくりと変化するため、これは実現可能です)現在理解している方法では、1週間前の完全バックアップと1週間分のトランザクションログバックアップが必要になります。完全バックアップと差分バックアップは、特定の時点に復元するためにのみ使用できるためです。
したがって、フルバックアップジョブのCleanupTime
オプションを24*7
?私が今推測しているのは、それを24hに設定すると、次のFULLバックアップにより、すべての古いFull、diffおよびトランザクションログバックアップファイルが削除され、ポイントインタイムリカバリウィンドウを... 0時間のままにしておく。正しい?
_@CleanupTime
_は、特定のバックアップジョブに対して常に指定されます。たとえば、Fullバックアップジョブ、Differentialバックアップジョブ、およびTransaction Logバックアップジョブを作成した場合、_@CleanupTime
_常に仕事の延長に関連しています。
Fullバックアップの例を見てみましょう。
完全バックアップジョブを作成する場合は、通常、次のパラメータを1つ以上追加します。
@Databases
_:バックアップするデータベース(この例には実際には関係ありません)@Directory
_:バックアップを保存するディレクトリ@BackupType
_:フル、差分、TLog@CleanupTime
_:保持するバックアップの時間数@FileExtensionFull
_:バックアップの拡張子。これで、atジョブに定義したスケジュールに従ってfullバックアップを作成するバックアップジョブが準備できました。次のことを前提とします。
@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.
_
まあ、それは多くを助けていません。サイトの公式ドキュメントと同じです。さらに掘り下げましょう。スクリプトをスキャンすると、最終的に次のようなセクションが見つかります。
スクリプトは読みやすくするためにラップされています
IF @BackupSoftware IS NULL BEGIN SET @ CurrentCommandType02 = 'xp_delete_file' SET @ CurrentCommand02 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master] .dbo.xp_delete_file 0、 N' '' + REPLACE(@CurrentDirectoryPath、 '' ''、 '' '' '' )+ '' '、-最初のパラメーター ' '' + @CurrentFileExtension + '' '、--2番目のパラメーター ' '' + CONVERT(nvarchar(19)、@ CurrentCleanupDate、126 )+ '' '-3番目のパラメーター IF @ReturnCode 0 RAISERROR(' 'Error deleted files。' '、16、1)' END
したがって、Olaは基本的にSQL Serverの組み込み_xp_delete_file function
_を使用して、特定の時間にファイルを削除します。
@CurrentDirectoryPath
_@CurrentFileExtension
_@CurrentCleanupDate
_しかし、たとえば、_@CurrentCleanupDate
_がどうなるか待ってください。スクリプトを少し前に戻すと、次のようなセクションが見つかります。
INSERT INTO @CurrentCleanupDates(CleanupDate、Mirror) SELECT DATEADD(hh、@ CleanupTime)、GETDATE())、0
ああ、つまり、_@CurrentCleanupDate
_は、_@CleanupTime
_と現在の時刻GETDATE()
から計算される日付の加算です。涼しい。
(...通常のデータベースとミラーデータベースの両方のセクションに---(Mirror
が含まれているため、コードにタイプミスがある可能性がありますコード)
次に、_@CurrentFileExtension
_の関連セクションは何ですか?もう一度検索してみましょう。そして私たちは見つける:
SELECT @CurrentFileExtension = CASE WHEN @CurrentBackupType = 'FULL' THEN @FileExtensionFull WHEN @CurrentBackupType = 'DIFF' THEN @FileExtensionDiff WHEN @CurrentBackupType = ' LOG 'THEN @FileExtensionLog END
だからあなたはそれを持っています。
Fullバックアップジョブのパラメータが_@FileExtensionFull='BAK'
_として設定されており、_@CleanupTime=24
_を設定している場合、プロシージャはすべてのFullバックアップファイルを削除します少なくとも1日以上経過している(24時間)。
実行される_@CurrentCommand02
_は基本的に:
_xp_delete_file 0, 'F:\SQLBACKUP', 'BAK', '2018-08-20 20:00:00.045'
_
したがって、他のバックアップファイルには影響しません。 (もちろん、_'BAK'
_をすべてのバックアップタイプの拡張として定義した場合を除き、その場合は失われます)。
@ hot2useの回答はこの質問を詳しくカバーしているので賛成しましたが、これをテストする簡単な方法を共有したいと思いました。
次の場合、スクリプトがどのように機能するかを完全に理解するのに役立ちます(それが私に役立ちました)。
hh
をminute
で検索/置換します。 hh
で参照できる唯一の参照は、スクリプトがクリーンアップ時間を処理している場所です。これにより、さまざまなタイプ(FULL、DIFF、LOG)のバックアップをすばやく実行して、保持が数時間ではなく数分になるため、実行の影響を確認できます。テストデータベースの完全、差分、およびログバックアップを実行し、個々のフォルダに作成されたファイルをメモします。これは私が使用したものです(スクリプトを数時間から数分に変更したため、1分のCleanupTime
に注意してください)。
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
バックアップが作成され、1分より古いFULL
バックアップファイルが削除されました。 DIFF
またはLOG
バックアップファイルは影響を受けませんでした。
[〜#〜] diff [〜#〜]
DIFF
バックアップを実行するたびに、新しいDIFF
バックアップが作成され、1分より古いDIFF
バックアップファイルが削除されました。 FULL
またはLOG
バックアップファイルは影響を受けませんでした。
[〜#〜] log [〜#〜]
LOG
バックアップを実行するたびに、新しいLOG
バックアップが作成されました。継続的なLOG
バックアップ(介在するFULL
またはDIFF
バックアップなし)は、クリーンアップ時間に関係なく、LOG
バックアップフォルダーに蓄積され続けました。 FULL
またはDIFF
バックアップが最終的に作成された場合、LOG
バックアップのNEXT実行により、最新のLOG
またはFULL
よりも古い、1分より古いDIFF
バックアップが削除されました。
FULL
バックアップの実行中に、DIFF
またはLOG
バックアップファイルが影響を受けることはありませんでした。
復元するために時間を遡る必要がある場合に備えて、FULL
バックアップを1週間以上保持することをお勧めします。 2週間のFULL
バックアップを想定すると、336時間のCleanupTime
が必要になります。
1分のテストでは、次のことがわかります。
FULL
バックアップを実行しても、DIFF
またはLOG
バックアップは削除されませんDIFF
バックアップを実行しても、FULL
またはLOG
バックアップは削除されませんLOG
バックアップを実行しても、FULL
またはDIFF
バックアップは削除されません私はこれに遭遇したばかりなので、他の2つの答えを拡張します。
注目に値するかもしれません(これをグーグルでだれでも)。バックアップを保持したい正確な時間より少し長くすることができます。
Opが1週間前のバックアップを保持したい場合、24時間年中無休で1週間前のファイルが常に保持されるとは限りません。理由:データベースが増加しています。新しいバックアップには少し時間がかかる場合があります。
最初のバックアップファイルが2020-03-15 03:00:05.000で作成され、次のバックアップに少し時間がかかり、ファイルが作成される場合2020-03-22 30:00:0 6。000-それは指定された168時間以上です(1秒、気にしてください)
安全のため、24時間年中無休で対応してください!