web-dev-qa-db-ja.com

フルバックアップとログバックアップに関連するOla HallengrenのSQL ServerスクリプトのCleanupTimeについて

Ola Hallengren Server Maintenance SolutionCleanupTimeオプションに何が期待できるかを正確に理解できません。私はいくつかの関連する質問と精巧な答えを見つけていますが、説明はまだ私を少し困惑させます。

具体的には:

毎週のフルバックアップ、毎日の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時間のままにしておく。正しい?

7
Wouter

_@CleanupTime_は、特定のバックアップジョブに対して常に指定されます。たとえば、Fullバックアップジョブ、Differentialバックアップジョブ、およびTransaction Logバックアップジョブを作成した場合、_@CleanupTime_常に仕事の延長に関連しています。

Fullバックアップの例を見てみましょう。

完全バックアップ

完全バックアップジョブを作成する場合は、通常、次のパラメータを1つ以上追加します。

  • _@Databases_:バックアップするデータベース(この例には実際には関係ありません)
  • _@Directory_:バックアップを保存するディレクトリ
  • _@BackupType_:フル、差分、TLog
  • _@CleanupTime_:保持するバックアップの時間数
  • _@FileExtensionFull_:バックアップの拡張子。

これで、atジョブに定義したスケジュールに従ってfullバックアップを作成するバックアップジョブが準備できました。次のことを前提とします。

  • このジョブは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.
_

まあ、それは多くを助けていません。サイトの公式ドキュメントと同じです。さらに掘り下げましょう。スクリプトをスキャンすると、最終的に次のようなセクションが見つかります。

スクリプトは読みやすくするためにラップされています

 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'_をすべてのバックアップタイプの拡張として定義した場合を除き、その場合は失われます)。

18

@ hot2useの回答はこの質問を詳しくカバーしているので賛成しましたが、これをテストする簡単な方法を共有したいと思いました。

次の場合、スクリプトがどのように機能するかを完全に理解するのに役立ちます(それが私に役立ちました)。

  1. バックアップスクリプト(およびその他の依存関係)をテストインスタンスにインストールします。ローカルコンピューターでテストしました。
  2. 次に、スクリプトを変更し、hhminuteで検索/置換します。 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バックアップは削除されません
8
Scott Hodgin

私はこれに遭遇したばかりなので、他の2つの答えを拡張します。

注目に値するかもしれません(これをグーグルでだれでも)。バックアップを保持したい正確な時間より少し長くすることができます。

Opが1週間前のバックアップを保持したい場合、24時間年中無休で1週間前のファイルが常に保持されるとは限りません。理由:データベースが増加しています。新しいバックアップには少し時間がかかる場合があります。

最初のバックアップファイルが2020-03-15 03:00:05.000で作成され、次のバックアップに少し時間がかかり、ファイルが作成される場合2020-03-22 30:00:0 6。000-それは指定された168時間以上です(1秒、気にしてください)

安全のため、24時間年中無休で対応してください!

0
Daniel