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 任务做错了。我如何解决它?或者是别的什么?
小智 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)