Sql-Server

清理沒有 xp_cmdshell 或維護計劃的備份文件

  • September 21, 2011

背景:

我們有一個需要執行 xp_cmdshell 的備份腳本。我決定在新伺服器上,我們不會啟用 xp_cmdshell。我在作業開始時啟用了 xp_cmdshell 並在最後將其關閉。問題是,如果一個完整備份開始並且每小時日誌備份執行並完成,它將關閉 xp_cmdshell 並且每小時備份將失敗。

這導致我嘗試檢測作業是否正在執行等。但是可能有更好的清理方法嗎?

實際問題:

成功執行備份作業後,如何刪除舊的備份文件?

它需要是可編寫腳本的,如果我得到正確的通知,它會排除維護計劃。

它不會使用 xp_cmdshell 來避免整個工作互動的事情並遵循良好的做法。

最好的方案是讓它從備份腳本中執行,這樣它會在成功備份後刪除備份文件。如果由於某種原因在備份中出現錯誤,這將使其他數據庫的備份繼續進行。

推測: 也許一個 powershell 腳本可以解決問題?這可以被編寫成一個作業步驟,並在成功時有條件地執行……但是如果我們中途失敗,這一切都會在最後留下備份 - 如果我們緊張,則需要手動清理備份驅動器空間。

當我要在每小時作業中關閉 xp_cmdshell 時,也許我只是檢查每小時作業是否正在執行。我可能會同意,但你會怎麼做

我在備份步驟之後向我的備份作業添加了一個作業步驟,並執行下面的程式碼版本。這將刪除任何超過 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

引用自:https://serverfault.com/questions/313698