Sql-Server
清理沒有 xp_cmdshell 或維護計劃的備份文件
背景:
我們有一個需要執行 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