我想使用 SQL 代理作业(这很可能涉及执行 SSIS 包)动态备份给定 SSAS 实例上的所有数据库。这是一个动态过程非常重要——如果用户添加数据库或多维数据集,我想设置一个可以自动检测所有现有 SSAS 元数据的作业。
不幸的是,我没有看到任何可以告诉我如何以干净的方式自动动态备份 SSAS 实例上的所有数据库的信息。“干净”是指:
DatabaseId
在备份命令中使用,而不是DatabaseName
.DatabaseName
有时 a和 a之间可能存在差异DatabaseId
,如果存在差异DatabaseName
,如果使用 代替,则备份将失败DatabaseId
。仅查询 Catalogs 架构不会给我DatabaseId
.- 避免每次遇到要备份的新实例时都需要创建链接服务器。
这实际上是可以做到的。可能有几种方法可以做到这一点,这里有一个相当简单的例子。对于此解决方案,您将使用以下组合:
Execute Script Task
对象(AMO)的 。创建 SSIS 包
变量
变量名|范围|类型
备份目录 | 包级别或 Foreach 级别 | 细绳
数据库ID | 包级别或 Foreach 级别 | 细绳
数据库名称 | 包级别或 Foreach 级别 | 细绳
InstanceForDatasource | 包装等级 | 细绳
连接字符串 | 包装等级 | 细绳
将 EvaluateAsExpression 属性设置为 true。
如下设置表达式属性:
Data Source="+ @[User::InstanceForDatasource] +";Provider=MSOLAP.4;Integrated Security=SSPI;
请注意,此方法可以扩展为使整个 ConnectionString 是动态的,并在必要时由调用 SQL 代理作业步骤指示。
XMLAScript | 包或 Foreach 级别 | 细绳
连接管理器
在设计时使用真正的连接,以便元数据播放得很好。
现在不需要创建连接管理器,但它使以后更容易。对于流程中的每个任务,您将在下拉列表中获得适当的连接管理器,而无需即时创建任何内容。
网络
[User::ConnectionString]
OLEDB
[User::ConnectionString] + "Format=Tabular;"
分析服务
[User::ConnectionString] = "Impersonation Level=Impersonate;"
创建 Foreach 容器
在这里,您将基于 Catalogs 架构行集创建一个 Foreach。这将为我们获取
DatabaseName
实例中每个数据库的 ,DatabaseName
并将 放入其相应的变量中。创建执行脚本任务
将脚本设置为使用 Visual Basic。
如下设置 ReadOnlyVariables 和 ReadWriteVariables:
User::ConnectionString,User::DatabaseName,User::InstanceForDatasource
User::BackupDir,User::DatabaseId,User::XMLAScript
编辑脚本
添加对分析管理对象 (AMO) 程序集的引用。
右键单击项目名称(应该是单击编辑脚本时打开的 Visual Studio 窗口中项目资源管理器中最顶部的项目),然后选择添加引用。
添加对 Analysis Services 对象组件的引用。AMO 的 dll 应位于
<SQL Server InstallationDrive>:\Program Files\Microsoft SQL Server\<SQL Server Version>\SDK\Assemblies
.在脚本头中,添加 Imports 语句以使用 AMO:
Imports Microsoft.AnalysisServices
将 Public Sub Main() 的内容替换为以下脚本:
创建文件系统任务(创建备份目录)
UseDirectoryIfExists
如果备份目录已经存在,设置为true
避免错误很重要。编辑执行脚本任务和文件系统任务之间的优先约束
此优先约束将处理缺少的 DatabaseId。如果无法在 vbscript 中建立与 SSAS 服务器的连接,或者数据库已损坏,则 DatabaseId 将丢失。您不想备份损坏的数据库。它将使备份停止。
表达式示例:`@[User::DatabaseId] !=""
创建 Analysis Services 执行 DDL 任务
您的最终控制流应如下所示:
创建 SQL 代理作业
InstanceForDatasource
为步骤的实例名称。Property Path
:\Package.Variables[User::InstanceForDatasource].Properties[Value]
笔记:
要使整个备份目录动态化,您只需为此添加另一个变量并在 vbscript 中说明它。
同样,如有必要,整个连接字符串变量可以由 SQL 代理作业设置,而不仅仅是实例名称。
另一种选择是 Powershell SQL Server Analysis Services Backup in Powershell
我在没有任何 SSIS 的情况下实现了这一点。我改用链接服务器。我花了一些时间,但我仍然相信这是备份 SSAS 数据库的最佳方式。
你可以在这个链接上看到我是如何做到的。
我还删除了旧的备份文件,你可以在这个链接上看到。