如何为每日SSAS Cube备份生成带日期的唯一文件名并清理旧备份
我来帮你解决这个问题,之前也碰到过类似的需求,下面分SSIS和SQL Server Agent两种方案给你详细步骤:
方案一:在SSIS中实现带日期的Cube备份+自动清理旧文件
1. 创建SSIS变量生成带日期的备份文件名
- 打开你的SSIS包,按
Ctrl+Alt+V调出变量窗口,新建一个字符串类型的变量,命名为@BackupFileName。 - 点击变量的表达式列,输入以下表达式:
这个表达式会生成类似"B:\\Backups\\Cubes\\MyCube_" + REPLACE((DT_WSTR, 10)GETDATE(), "-", "_") + ".abf"B:\Backups\Cubes\MyCube_2018_05_09.abf的文件名,注意反斜杠要转义成\\,日期格式会自动把yyyy-MM-dd转换成下划线分隔的形式。 - 勾选表达式旁边的复选框,启用这个动态生成逻辑。
2. 修改Analysis Services Execute DDL任务的XMLA脚本
- 选中你的Execute DDL任务,打开编辑器切换到表达式标签页。
- 找到SourceDirect属性,点击表达式按钮,输入以下拼接后的XMLA脚本:
这里把原来固定的文件名替换成我们的变量,确保每次执行都会生成带当日日期的唯一备份文件。"<Backup xmlns=\"http://schemas.microsoft.com/analysisservices/2003/engine\"><Object><DatabaseID>MyCube</DatabaseID></Object><File>" + @[User::BackupFileName] + "</File><AllowOverwrite>true</AllowOverwrite></Backup>" - 验证表达式无误后点击确定,保存任务设置。
3. 添加自动清理旧备份的任务
方法A:用Execute Process Task执行CMD命令
- 在SSIS包中添加一个Execute Process Task,放在备份任务之后(确保备份完成再清理)。
- 打开任务编辑器,设置:
- Executable:
C:\Windows\System32\cmd.exe - Arguments:
/c forfiles /p "B:\Backups\Cubes" /s /m MyCube_*.abf /d -14 /c "cmd /c del @path"
这个命令会在指定目录下查找所有以MyCube_开头的.abf文件,自动删除14天前的旧备份。
- Executable:
方法B:用Script Task写C#代码清理
- 添加一个Script Task,选择C#作为脚本语言,编辑脚本:
using System.IO; using Microsoft.SqlServer.Dts.Runtime; public void Main() { string backupDir = @"B:\Backups\Cubes"; string searchPattern = "MyCube_*.abf"; int daysToKeep = 14; DateTime cutoffDate = DateTime.Now.AddDays(-daysToKeep); foreach (string file in Directory.GetFiles(backupDir, searchPattern)) { FileInfo fi = new FileInfo(file); if (fi.LastWriteTime < cutoffDate) { fi.Delete(); } } Dts.TaskResult = (int)ScriptResults.Success; } - 保存脚本后,任务执行时会自动清理两周前的旧备份文件。
方案二:用SQL Server Agent作业实现(无需SSIS)
如果更倾向于用Agent统一管理任务,可以直接创建一个作业,分两个步骤完成:
步骤1:执行XMLA备份生成带日期的文件
- 新建一个Agent作业,添加一个PowerShell类型的步骤,输入以下脚本:
# 替换成你的Analysis Services实例名,比如localhost\SSAS $asServerName = "YourASInstance" $dateSuffix = Get-Date -Format "yyyy_MM_dd" $backupFilePath = "B:\Backups\Cubes\MyCube_$dateSuffix.abf" # 构造XMLA备份脚本 $xmlaScript = @" <Backup xmlns="http://schemas.microsoft.com/analysisservices/2003/engine"> <Object> <DatabaseID>MyCube</DatabaseID> </Object> <File>$backupFilePath</File> <AllowOverwrite>true</AllowOverwrite> </Backup> "@ # 执行备份 Import-Module SQLPS -DisableNameChecking Invoke-ASCmd -Server $asServerName -Query $xmlaScript
步骤2:清理两周前的旧备份
- 添加另一个PowerShell步骤,输入:
$backupDir = "B:\Backups\Cubes" $searchPattern = "MyCube_*.abf" $daysToKeep = 14 $cutoffDate = (Get-Date).AddDays(-$daysToKeep) # 删除符合条件的旧文件 Get-ChildItem -Path $backupDir -Filter $searchPattern | Where-Object { $_.LastWriteTime -lt $cutoffDate } | Remove-Item -Force - 也可以用CmdExec步骤直接执行之前的forfiles命令,效果一致。
注意事项
- 权限问题:无论是SSIS执行账户还是Agent作业账户,都需要:
- 对Analysis Services服务器拥有数据库备份权限(可在SSMS中给账户分配对应角色);
- 对备份目录
B:\Backups\Cubes拥有读写权限。
- 日期格式自定义:如果需要其他格式的日期后缀,比如
yyyyMMdd,可以修改变量表达式或PowerShell中的-Format参数即可。 - 测试验证:建议先手动执行任务/作业,确认备份文件生成正确、旧文件被正常清理,避免意外数据风险。
内容的提问来源于stack exchange,提问作者JC_BI
相关产品推荐
相关产品推荐

