如何正确丢弃旧备份?

Mat*_*don 5 sql-server backup ssis sql-server-2014

我的SSIS 控制流中有一个执行 SQL 任务,它在继续运行隔夜 ETL 之前备份了许多数据库:

EXECUTE master.dbo.xp_create_subdir N'G:\Backups\DQ'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\master'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\Metadata'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\NDS'
GO
EXECUTE master.dbo.xp_create_subdir N'G:\Backups\Staging'
GO
BACKUP DATABASE [DQ] TO  DISK = N'G:\Backups\DQ\DQ.bak' WITH  RETAINDAYS = 3, NOFORMAT, NOINIT,  NAME = N'DQ', SKIP, REWIND, NOUNLOAD,  STATS = 10
GO
BACKUP DATABASE [master] TO  DISK = N'G:\Backups\master\master.bak' WITH  RETAINDAYS = 3, NOFORMAT, NOINIT,  NAME = N'master', SKIP, REWIND, NOUNLOAD,  STATS = 10
GO
BACKUP DATABASE [Metadata] TO  DISK = N'G:\Backups\Metadata\Metadata.bak' WITH  RETAINDAYS = 3, NOFORMAT, NOINIT,  NAME = N'Metadata', SKIP, REWIND, NOUNLOAD,  STATS = 10
GO
BACKUP DATABASE [NDS] TO  DISK = N'G:\Backups\NDS\NDS.bak' WITH  RETAINDAYS = 3, NOFORMAT, NOINIT,  NAME = N'NDS', SKIP, REWIND, NOUNLOAD,  STATS = 10
GO
BACKUP DATABASE [Staging] TO  DISK = N'G:\Backups\Staging\Staging.bak' WITH  RETAINDAYS = 3, NOFORMAT, NOINIT,  NAME = N'Staging', SKIP, REWIND, NOUNLOAD,  STATS = 10
Run Code Online (Sandbox Code Playgroud)

目的是只保留 3 天,并丢弃任何旧的。

问题是 .bak 文件只会持续增长一两个星期,直到 G 驱动器填满并且执行 SQL 任务失败,这会中止隔夜 ETL。

似乎 .bak 显然没有丢弃旧的备份;看起来我可以一直回到上次删除所有备份以释放该 G 驱动器上的一些磁盘空间时:

“恢复到”对话框显示完整的数据库备份可以追溯到一整周

问题很简单:看起来我的执行 SQL 任务做错了。我如何解决它?或者是别的什么?

Kin*_*hah 5

我对您的最佳建议是使用Ola已经广受赞誉的备份解决方案

清理时间

指定删除备份文件之前的时间(以小时为单位)。如果未指定时间,则不会删除任何备份文件。

我通常使用backup database ... with init然后删除超过 X 天的备份文件。

Ola 的解决方案是一站式解决方案,非常灵活,因此您可以根据需要对其进行调整。


小智 3

您将需要切换到使用以下备份语句:

BACKUP DATABASE [Dbname] TO DISK = <Path> + <BackupName> WITH INIT
Run Code Online (Sandbox Code Playgroud)

BackupName使用可能包含包运行时的变量来构建您的。将该时间戳转换为yyyymmddm完整备份文件名,如下所示:DatabaseName_FULL_2015122205.bak

然后,您可以在包中添加一个进程任务来执行 PowerShell 命令来删除超过 3 天的文件。您的流程可能是:

powershell.exe -Command "Get-ChildItem $BackupDirectory -Include *.bak -Recurse | where {$_.LastWriteTime -le ( (Get-Date).AddDays(-3) )| Remove-Item -force"
Run Code Online (Sandbox Code Playgroud)