【SQL SERVER】删除过期的SQL Server备份文件

时间:2021-10-22 14:07:14

近期遇到定时任务中清理数据库过期文件失效的问题,总结了下删除过期数据库备份文件的相关方法,总结如下:

1.BAT脚本法

脚本DEMO(删除两天前的数据):
FORFILES /P “E:\Backup” /M *.bak /C “cmd /C del /Q @path” /d -2
说明:
FORFILES /P “文件路径” /M 文件名(通配符) /C “cmd /C del /Q @path” /d -几天前的数据
优点:不仅能删除bat文件,其他windows下的过期文件也可以一并清理。
缺点:权限过大,可能误删文件

2.xp_delete_file

脚本demo:

DECLARE @oldDate DATETIME  
SET @oldDate = GETDATE()-7 --删除7天前数据
EXECUTE MASTER.dbo.xp_delete_file
0, --0: 备份文件,1: 维护计划文本报告
N'D:\database_bak\', --文件路径
N'
bak', --文件扩展名
@oldDate, --在此时间之前的文件一律删除
1 --删除子文件夹中的文件

优点:安全性好,权限要求不高
缺点:不能删除SQL Server之外创建的文件,包括RAR

3.xp_cmdshell

这个是方法一的SQL实现:

DECLARE @directory NVARCHAR(50)     --目录 
DECLARE @days NVARCHAR(10) --保留多少天
DECLARE @extensions NVARCHAR(MAX) --扩展名
DECLARE @scripts NVARCHAR(4000)
SET @directory=N'd:\database_bak'
SET @days = N'7'
SET @extensions = N'bak'
SET @scripts=N'forfiles /p "'+@directory+'" /s /m *.'+@extensions+' /d -'+@days+' /c "cmd /c del @path"'
EXEC xp_cmdshell @scripts

4. PowerShell

$timeOutDay = 7  
$filePath = "d:\database_bak"
$allFile = Get-ChildItem -Path $filePath

foreach($file in $allFile)
{
$daySpan = ((Get-Date) - $file.LastWriteTime).Days
if ($daySpan -gt $timeOutDay)
{
Remove-Item $file.FullName -Recurse -Force
}
}

优点:灵活,可删除任何类型的文件
缺点:安全性,适用于SqlServer2005以上版本