資料庫備份檔案日積月累會佔滿磁碟,需定期清理舊備份。除維護計畫外,可利用 Windows 內建 FORFILES 指令搭配 xp_cmdshell 在 T-SQL 中直接執行刪除,靈活且無需外部排程工具。
FORFILES 參數與變數速查
常用參數
| 參數 | 說明 |
/P | 搜尋路徑 |
/M | 檔案搜尋遮罩 (預設 *.*) |
/S | 遞迴搜尋子目錄 |
/C | 對每個符合檔案執行的命令,需雙引號括住,預設 "cmd /c echo @file" |
/D | 依最後修改日期篩選:+dd/MM/yyyy (含當日之後) 或 -N (N 天前) |
可用變數 (在 /C 命令中使用)
| 變數 | 說明 |
@FILE | 完整檔名 |
@FNAME | 不含副檔名檔名 |
@EXT | 副檔名 |
@PATH | 絕對路徑 |
@RELPATH | 相對路徑 |
@ISDIR | 是否為目錄 (TRUE/FALSE) |
@FSIZE | 檔案大小 (Bytes) |
@FDATE | 最後修改日期 |
@FTIME | 最後修改時間 |
實用刪除範例 (在 T-SQL 中執行)
所有範例均使用 /Q (安靜模式) 與 /F (強制刪除唯讀檔)。
範例 1:刪除指定日期後的 .sql 檔
EXEC xp_cmdshell 'FORFILES /P C:\BACKUP /S /M *.sql /D +10/18/2008 /C "CMD /C DEL /Q /F @FILE"'
範例 2:刪除 30 天前的 .sql 檔
EXEC xp_cmdshell 'FORFILES /P C:\BACKUP /S /M *.sql /D -30 /C "CMD /C DEL /Q /F @FILE"'
範例 3:刪除 30 天前且檔名以 F_ 開頭的 .sql 檔
EXEC xp_cmdshell 'FORFILES /P C:\BACKUP /S /M F_*.sql /D -30 /C "CMD /C DEL /Q /F @FILE"'
進階應用建議
- 建立預存程序封裝:將路徑、天數、檔案模式參數化,方便維護計畫呼叫。
- 記錄刪除日誌:在
/C 命令中加入 ECHO @FILE @FDATE @FTIME >> C:\Logs\BackupCleanup.log 留存稽核軌跡。
- 搭配備份類型命名:如
DBName_Full_*.bak、DBName_Diff_*.bak、DBName_Log_*.trn,可針對不同備份類型設定不同保留天數。
- 安全性注意:
xp_cmdshell 預設停用,啟用時需嚴格限制執行權限 (僅 sysadmin),並審計用法。
替代方案比較