Desejo fazer backup dinamicamente de todos os bancos de dados em uma determinada instância SSAS usando um trabalho do SQL Agent (que provavelmente envolveria a execução de um pacote SSIS). É imperativo que este seja um processo dinâmico - se os usuários adicionarem bancos de dados ou cubos, desejo configurar um trabalho uma vez que possa detectar automaticamente todos os metadados SSAS existentes.
Infelizmente, não vejo nada por aí que me diga como posso fazer backup automática e dinamicamente de todos os bancos de dados em uma instância do SSAS de maneira limpa. Por "limpo" quero dizer:
- Usando o
DatabaseId
no comando de backup, não o arquivoDatabaseName
. Às vezes, pode haver uma diferença entre aDatabaseName
e aDatabaseId
, e se houver uma diferença, o backup falhará se oDatabaseName
for usado no lugar doDatabaseId
. Apenas consultar o esquema de Catálogos sozinho não me dará o arquivoDatabaseId
. - Evitando a necessidade de criar um servidor vinculado toda vez que encontro uma nova instância para fazer backup.
Isso pode de fato ser feito. Provavelmente existem algumas maneiras de fazer isso, e aqui está um exemplo bastante direto. Para esta solução, você usará uma combinação de:
Execute Script Task
que usa o Analysis Management Objects (AMO) .Criar o pacote SSIS
Variáveis
VariableName|Scope|Type
BackupDir | Nível do pacote ou nível Foreach | Corda
ID do banco de dados | Nível do pacote ou nível Foreach | Corda
DatabaseName | Nível do pacote ou nível Foreach | Corda
InstanceForDatasource | Nível do pacote | Corda
Cadeia de Conexão | Nível do pacote | Corda
Defina a propriedade EvaluateAsExpression como true.
Defina a propriedade Expression da seguinte maneira:
Data Source="+ @[User::InstanceForDatasource] +";Provider=MSOLAP.4;Integrated Security=SSPI;
Observe que essa abordagem pode ser expandida para que toda a ConnectionString seja dinâmica e ditada pela etapa de trabalho do SQL Agent de chamada, se necessário.
XMLAScript | Nível Package ou Foreach | Corda
Gerenciadores de conexão
Use uma conexão real em tempo de design para que os metadados funcionem bem.
A criação dos gerenciadores de conexões agora não é necessária, mas facilita mais tarde. Para cada tarefa no processo, você terá o gerenciador de conexões apropriado disponível no menu suspenso, sem a necessidade de criar nenhum em tempo real.
ADO.NET
[User::ConnectionString]
OLEDB
[User::ConnectionString] + "Format=Tabular;"
Serviços de análise
[User::ConnectionString] = "Impersonation Level=Impersonate;"
Crie o Contêiner Foreach
Aqui, você criará um Foreach com base no conjunto de linhas do esquema Catalogs. Isso nos dará o
DatabaseName
para cada banco de dados na instância eDatabaseName
será colocado em sua variável correspondente.Criar uma tarefa de script de execução
Defina o script para usar o Visual Basic.
Defina ReadOnlyVariables e ReadWriteVariables da seguinte maneira:
User::ConnectionString,User::DatabaseName,User::InstanceForDatasource
User::BackupDir,User::DatabaseId,User::XMLAScript
Editar o roteiro
Adicione uma referência ao assembly Analysis Management Objects (AMO).
Clique com o botão direito do mouse no nome do projeto (deve ser o item superior no Project Explorer na janela do Visual Studio que se abriu quando você clicou em Edit Script) e selecione Add Reference.
Adicione uma referência ao componente Analysis Services Objects. A dll para AMO deve estar localizada em
<SQL Server InstallationDrive>:\Program Files\Microsoft SQL Server\<SQL Server Version>\SDK\Assemblies
.No cabeçalho do script, adicione uma instrução Imports para usar o AMO:
Imports Microsoft.AnalysisServices
Substitua o conteúdo de Public Sub Main() pelo seguinte script:
Criar uma tarefa do sistema de arquivos (para criar o diretório de backup)
É importante definir
UseDirectoryIfExists
paratrue
evitar um erro se o diretório de backup já existir.Edite a restrição de precedência entre a Tarefa Executar Script e a Tarefa do Sistema de Arquivos
Essa restrição de precedência manipulará um DatabaseId ausente. O DatabaseId estaria ausente se uma conexão com o servidor SSAS não pudesse ser estabelecida no vbscript ou se o banco de dados estivesse corrompido. Você não deseja fazer backup de um banco de dados corrompido. Isso interromperá o backup.
Exemplo de Expressão: `@[User::DatabaseId] !=""
Criar uma tarefa DDL de execução do Analysis Services
Seu fluxo de controle final deve ficar assim:
Criar o trabalho do SQL Agent
InstanceForDatasource
como o nome da instância da etapa.Property Path
:\Package.Variables[User::InstanceForDatasource].Properties[Value]
Notas:
Para tornar todo o diretório de backup dinâmico, bastaria adicionar outra variável para isso e contabilizar no vbscript.
Novamente, se necessário, toda a variável de cadeia de conexão pode ser definida pelo trabalho do SQL Agent em vez de apenas o nome da instância.
Outra opção seria Powershell SQL Server Analysis Services Backup no Powershell
Eu consegui isso sem nenhum SSIS. Em vez disso, usei um servidor vinculado. Levei algum tempo, mas ainda acredito que é a melhor maneira de fazer backup de bancos de dados SSAS.
Você pode ver como fiz neste link .
Também apago arquivos de backup antigos, como você pode ver neste link .