web-dev-qa-db-ja.com

(Ola Hallengren)トランザクションログバックアップの削除

私たちは、Olaのスクリプトを使用して、毎週の完全、毎晩の差分、および毎時のトランザクションログを実行しています。すべてのジョブでバックアップが正しく作成されており、完全ジョブと差分ジョブは1週間後にクリーンアップされます。トランザクションログは48時間後にクリーンアップするように設定されています(NAS夜間に保存されるため、これらのファイルは必要な場合でも引き続きアクセスできます。

特定のデータベースのトランザクションログがクリーンアップされていないことがわかります。つまり、ファイルシステムを見ると、1か月前から今日までのトランザクションログを見つけることができます。私がこれについて考えることができる唯一の理由は、より新しい差分バックアップが存在しないが、存在していて、それらが別のディレクトリに移動されていない場合です。どのジョブも、手動でトリガーされた、またはスケジュールから実行されたあらゆる種類の障害を記録していません。他のジョブは実行され、問題なくクリーンアップされています。許可の問題は除外されています(NASでも確認しましたが、SQLサーバーエージェントにはフルコントロールがあります)。

ログバックアップジョブによって実行されている現在のステップ:

sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE [dbo].[DatabaseBackup] @Databases = 'USER_DATABASES', @Directory = N'\\server\folder\', @BackupType = 'LOG', @Verify = 'Y', @CleanupTime = 48, @CheckSum = 'Y', @LogToTable = 'Y'" -b

比較のために問題なくクリーンアップするDiffジョブを次に示します

sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE [dbo].[DatabaseBackup] @Databases = 'USER_DATABASES', @Directory = N'\\servername\folder', @BackupType = 'DIFF', @Verify = 'Y', @CleanupTime = 192, @CheckSum = 'Y', @LogToTable = 'Y'" -b

ジョブが完全バックアップまたは差分バックアップの存在を確認する方法について誰かがもっと知っていますか?または、これが発生している可能性のある他の理由?

ありがとう

2
QuoteUnquote

Olaのスクリプトの最新バージョンをダウンロードして実行したところ、問題は発生しなくなりました。すべての回答者に感謝します! :)

0
QuoteUnquote

バックアップ手順の差分とトランザクションログのバックアップ手順に関する情報のみを提供していることに気づきました。完全バックアップとは何ですか?

Olaは、完全および/またはDIFFバックアップが使用可能な場合にのみトランザクションログのバックアップを削除するフェイルセーフメカニズムを実装しています。

DatabaseBackupには、最新の完全バックアップまたは差分バックアップよりも新しいトランザクションログバックアップが削除されていないことを確認するチェックがあります。

参照:SQL Serverバックアップ ( ola.hallengren.comから)

つまり、最近のFULLまたはDIFFバックアップがない場合、@CleanupTimeパラメータは無効です。 CleanupTimeが通過しても、トランザクションログのバックアップはすべてディスクに保持されます。

FULL、DIFF、およびTLOGバックアップが一貫しており、ディスク上で使用可能かどうかを確認する必要がある場合があります。すべてのファイルを使用可能にすることが重要です。利用可能なシーケンス。

ディスク上のファイルの例

金曜日の午後3時30分(偶然)だとすると、すべてが正しく設定されている場合は、バックアップフォルダーで次のファイルが見つかります。
(私は完全バックアップと差分バックアップの間にセパレータを入れました)

SA | 1900 | FULL
----------------
SU | 1800 | DIFF
----------------
MO | 1800 | DIFF
----------------
TU | 1800 | DIFF
----------------
WE | 1800 | DIFF 
----------------
WE | 1800 | TLOG
WE | 1900 | TLOG
WE | 2000 | TLOG
WE | 2100 | TLOG
WE | 2200 | TLOG
WE | 2300 | TLOG
WE | 2400 | TLOG
TH | 0100 | TLOG
TH | 0200 | TLOG
TH | 0300 | TLOG
TH | 0400 | TLOG
TH | 0500 | TLOG
TH | 0600 | TLOG
TH | 0700 | TLOG
TH | 0800 | TLOG
TH | 0900 | TLOG
TH | 1000 | TLOG
TH | 1100 | TLOG
TH | 1200 | TLOG
TH | 1300 | TLOG
TH | 1400 | TLOG
TH | 1500 | TLOG
TH | 1600 | TLOG
TH | 1700 | TLOG
----------------
TH | 1800 | DIFF
----------------
TH | 1800 | TLOG
TH | 1900 | TLOG
TH | 2000 | TLOG
TH | 2100 | TLOG
TH | 2200 | TLOG
TH | 2300 | TLOG
TH | 2400 | TLOG
FR | 0100 | TLOG
FR | 0200 | TLOG
FR | 0300 | TLOG
FR | 0400 | TLOG
FR | 0500 | TLOG
FR | 0600 | TLOG
FR | 0700 | TLOG
FR | 0800 | TLOG
FR | 0900 | TLOG
FR | 1000 | TLOG
FR | 1100 | TLOG
FR | 1200 | TLOG
FR | 1300 | TLOG
FR | 1400 | TLOG
FR | 1500 | TLOG

TLOGファイルが削除されない理由

Olaのフェイルセーフメカニズム

DIFFバックアップが欠落している場合(たとえば、WEおよびTHからのDIFF)は、最後のDIFFまたはFULLバックアップまで、TLOGバックアップはディスクから削除されません。この例では、TLOG [〜#〜] tu [〜#〜]のDIFFバックアップまでの午後6時(1800)までのバックアップファイル。

ソリューション

  1. ディスクに完全バックアップと差分バックアップがあることを確認します。

「SQL Serverエージェント」サービスアカウントの不十分な権限

SQL Serverエージェント(インスタンス)サービスアカウントに、ファイルを削除するディレクトリに対する十分な権限がない場合、削除できませんTLOGバックアップファイル。

ソリューション

  1. SQL ServerエージェントサービスのWindowsアカウントがネットワークドライブにアクセスできることを確認します。

  2. ジョブステップのRun As設定がSQL Serverエージェントサービスアカウント

SQL ServerエージェントジョブがMsdbに記録されない

競合(ロック、ブロック、長時間実行トランザクション)が原因で、実行中のジョブのジョブステップがmsdbジョブテーブルに詳細を入力できない場合があります。 )。バックアップジョブに必要なテーブルが別のプロセスによってロックされています(別のメンテナンスプラン/他のサードパーティツール/クリーンアップジョブ/長時間実行されるトランザクション )そして、デッドロックの犠牲者として決定され、ロールバックされる可能性があります。 msdbデータベースにデータがありません。これは、FULLまたはDIFFバックアップが存在しないためです、何も削除されません。

OlaはこれをDatabaseBackupストアドプロシージャの次の部分でチェックします。

    IF @CurrentBackupType = 'LOG' AND (@CleanupTime IS NOT NULL OR @MirrorCleanupTime IS NOT NULL)
    BEGIN
      SELECT @CurrentLatestBackup = MAX(backup_finish_date)
      FROM msdb.dbo.backupset
      WHERE ([type] IN('D','I')
      OR database_backup_lsn < @CurrentDifferentialBaseLSN)
      AND is_damaged = 0
      AND database_name = @CurrentDatabaseName
    END

つまり、以前のDIFFまたはFULLバックアップのレコードをmsdbデータベースに記録できなかった場合、TLOGファイルは削除されません。

特別なソリューション

  1. 問題のデータベースの完全またはDIFFバックアップがmsdbデータベースに記録されていることを確認し、長時間実行されているトランザクションがないことを確認しますmsdbデータベース上。

  2. 複数のジョブを同時に実行している場合は、(その他の)ジョブを少し異なる時間に実行するように再スケジュールします。

幸運を。

1

ここでいくつかのことが起こっている可能性があります。

ファイルが間違った場所にあるか、予期しない拡張子が付いています

おそらくすべてのバックアップにOlaのスクリプトを使用しているため、これはありそうにありませんが、設定(ディレクトリの場所やログファイルの拡張子など)を変更した場合に備えて。

Olaのスクリプトの「クリーンアップ」部分は、この場所でバックアップを探しています(@Directoryパラメーターで指定したサーバー/フォルダーから開始)。あなたの質問では@Directory = N'\\server\folder\'を使用したので、続けます:

\\server\folder\{ServerName}${InstanceName}\{DatabaseName}\LOG

これがデフォルトの(名前のない)インスタンスである場合は、$InstanceNameの部分を無視できます。

削除するファイルがこのフォルダになく、拡張子が.trnでない場合、クリーンアップ手順で削除されません。

何かがログバックアップファイルに「触れています」

xp_delete_file拡張ストアドプロシージャの日付パラメーターは、「変更日」メタデータに基づいて削除されます。他のアプリケーションがこれらのファイルに「触れた」ため、Windowsが変更日をカットオフ内の時間に更新した場合、それらは削除されません。

権限の問題があります

SQL Serverエージェントサービスを実行しているアカウントには、バックアップを削除するフォルダーに対するフルコントロールが必要です。これが変更されていないことを確認してください。

検証チェックが失敗するか、その他の問題が発生しました

@LogToTable = 'Y'があることに気付きました-この間、エラーメッセージが報告されていないことを確認してください。

0
Josh Darnell