web-dev-qa-db-ja.com

xp_cmdshellまたはメンテナンスプランなしでバックアップファイルをクリーンアップする

背景:

Xp_cmdshellを実行する必要があるバックアップスクリプトがあります。新しいサーバーでは、xp_cmdshellを有効にしないことにしました。ジョブの開始時にxp_cmdshellを有効にし、終了時にオフにしました。問題は、完全バックアップが開始され、毎時ログバックアップが実行および終了すると、xp_cmdshellがオフになり、毎時バックアップが失敗することです。

これにより、ジョブが実行されているかどうかなどを検出しようとする道をたどりました。しかし、クリーンアップするためのより良い方法はおそらくありますか?

実際の質問:

バックアップジョブが正常に実行された後、古いバックアップファイルを削除するにはどうすればよいですか?

スクリプト化可能である必要があります。これにより、正しく通知された場合に保守計画が除外されます。

Xp_cmdshellを使用して、このジョブの相互作用全体を回避し、グッドプラクティスに従うことはありません。

最良のシナリオでは、バックアップスクリプト内から実行できるため、バックアップが正常に行われた後にバックアップファイルが削除されます。何らかの理由でバックアップにエラーが発生した場合、これにより他のデータベースのバックアップを続行できます。

推測:たぶん、PowerShellスクリプトでうまくいくでしょうか?それはジョブステップにスクリプト化され、成功すると条件付きで実行される可能性があります...しかし、途中で失敗した場合はバックアップを残して最後にすべてが発生します-タイトな場合はバックアップドライブを手動でクリーンアップする必要がありますスペース。

時間単位のジョブでxp_cmdshellをオフにするときに、時間単位のジョブが実行されているかどうかを確認するだけかもしれません。私はおそらくそれで行きます、しかしあなたは何をしますか

2
Sam

バックアップステップの後にバックアップジョブにジョブステップを追加し、以下のバージョンのコードを実行します。これにより、1日以上経過したBAKファイルがすべて削除されます。

declare
    @Ext NVARCHAR(4)
    ,@DelDt VARCHAR(19)
    ,@BackupPath VARCHAR(800)

select
    @Ext = 'bak'
    ,@BackupPath = 'D:\SQLBAK'

SELECT
    @DelDt = CONVERT(VARCHAR(19), DATEADD(hh, -24, GETDATE()), 126)

EXEC master.dbo.xp_delete_file 0, @BackupPath, @Ext, @DelDt
0