之前我有介紹過在SQL 2005的維護計劃中,若要清除過期檔案得另外加設Maintenance Cleanup Task

後來接到網友回應,提到資料庫備份到獨立子目錄時(Create a sub-directory for each database)的清理問題,由於原先也沒深入研究過,就順勢剖析了一下Maintenance Cleanup Task的原理。

下圖是Maintenance Cleanup Task的設定畫面,如果你備份時選取了Create a sub-directory for each database,在此就要加選"Include first-level subfolders"。

勾選後,SQL 2005會逐一清查X:\Backup下的各個子目錄,尋找其中過期的bak檔加以刪除。

我們可以用Process Monitor證明這一點! 下圖中,橘色區是選取"Include first-level subfolder"的情形,sqlserver會逐一檢查X:\Backup下的msdb, master, model(搜索範圍甚至到了由其他程式建立的Mail資料夾,不過我測試的結果,它會識別備份檔的命名規則,不致濫殺無辜)的*.bak,下方黃色區則可看出sqlserver只檢查了X:\Backup\*.bak。測試的結果

Maintenance Cleanup Task的設定畫面中,有個View T-SQL,按下後可以發現清理工作其實是由一隻文件沒記載的Stored Procedure所執行的:

EXECUTE master.dbo.xp_delete_file 0,N'X:\Backup',N'bak',N'07/13/2007 08:00:00',1

Include first-level subfolders選項會決定後方是否加上參數1。知道了原理,我們還可以衍生一些花式用法,例如: 只保留八小時的檔案之類的,哈!


Comments

# by HKC

太感謝你了...:P

Post a comment