我的 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
目的是只保留 3 天,并丢弃任何旧的。
问题是 .bak 文件只会持续增长一两周,直到 G 驱动器填满并且执行 SQL 任务失败,这会中止通宵的 ETL。
看起来 .bak 显然没有丢弃旧备份;看起来我可以一直回到上次删除所有备份以释放该 G 驱动器上的一些磁盘空间:
问题很简单:看起来我的Execute SQL Task做错了。我如何解决它?或者是别的什么?
我对您的最佳建议是使用Ola 已经广受赞誉的备份解决方案
我通常使用
backup database ... with init
然后删除早于 X 天的备份文件。Ola 的解决方案是一站式解决方案,非常灵活,因此您可以根据需要进行调整。
不幸的是,您将不得不在 BACKUP 命令以外的其他地方寻找以自动方式执行您想要的操作。
编写脚本或使用第 3 方工具,例如 SQLSafe 或 RedGate SQL Backup。
如果你读过这个名为 Backup 和邪恶的 RETAINDAYS 选项( archive ) 的简短咆哮,你会发现它实际上只是设置了一些过期标志,如果你尝试使用 INIT 进行备份,它会抛出错误。
您将要切换到使用以下备份语句:
BackupName
使用可能包含包运行时的变量构建您的。将该时间戳转换为类似于yyyymmddm
完整备份文件名的格式:DatabaseName_FULL_2015122205.bak
然后,您可以在包中添加一个进程任务来执行 PowerShell 命令来删除超过 3 天的文件。你的过程可能是: