Je veux dynamiquement Sauvegardez toutes les bases de données sur une instance SSAS donnée à l'aide d'un travail d'agent SQL (qui impliquerait probablement l'exécution d'un package SSIS ). Il est impératif qu'il s'agisse d'un processus dynamique - si les utilisateurs ajoutent des bases de données ou des cubes, je souhaite configurer un travail une fois capable de détecter automatiquement toutes les métadonnées SSAS existantes.
Malheureusement, je ne vois rien là-bas qui me dit comment je peux sauvegarder automatiquement et de manière dynamique toutes les bases de données sur une instance SSAS de manière propre. Par "propre", je veux dire:
DatabaseId
dans la commande de sauvegarde, non Le DatabaseName
. Parfois, il peut y avoir une différence entre un DatabaseName
et a DatabaseId
, et s'il y est est Une différence, la sauvegarde échouera si le DatabaseName
est utilisé à la place du DatabaseId
. Il suffit d'interroger le schéma de catalogues seul ne me donnera pas le DatabaseId
.Cela peut en fait être fait. Il y a probablement quelques façons de le faire, et voici un exemple assez simple. Pour cette solution, vous utiliserez une combinaison de:
Execute Script Task
qui utilise les Objets de gestion d'analyse (AMO) .Variablename | Scope | Type
BackupDir | Niveau de paquet ou de niveau foreach | Chaîne de caractères
DatabaseID | Niveau de paquet ou de niveau foreach | Chaîne de caractères
DatabasEname | Niveau de paquet ou de niveau foreach | Chaîne de caractères
InstanceFordatasource | Niveau de paquet | Chaîne de caractères
ConnexionsRing | Niveau de paquet | Chaîne de caractères
Définissez la propriété EvaluaeaseXPression sur True.
Définissez la propriété Expression comme suit: Data Source="+ @[User::InstanceForDatasource] +";Provider=MSOLAP.4;Integrated Security=SSPI;
Veuillez noter que cette approche peut être étendue à la totalité des connexions dynamiques et dictées par l'étape d'appel de l'agent SQL SQL si nécessaire.
Xmlascript | Paquet ou foresach niveau | Chaîne de caractères
Utilisez une vraie connexion dans la période de conception afin que les métadonnées jouent bien.
La création des responsables de la connexion n'est pas nécessaire, mais cela facilite la tâche ultérieure. Pour chaque tâche dans le processus, vous aurez le gestionnaire de connexion approprié disponible dans la liste déroulante sans la nécessité de créer une volée à la volée.] ==
ado.net
[User::ConnectionString]
OLEDB
[User::ConnectionString] + "Format=Tabular;"
Services d'analyse
[User::ConnectionString] = "Impersonation Level=Impersonate;"
Ici, vous créerez un forach basé sur les rowset de schéma de catalogues. Cela nous procurera le DatabaseName
pour chaque base de données dans l'instance et que le DatabaseName
sera mis dans sa variable correspondante.] ==
Définissez le script pour utiliser Visual Basic.
Définissez les readonlyvariables et ReadwriteVariables comme suit:
User::ConnectionString,User::DatabaseName,User::InstanceForDatasource
User::BackupDir,User::DatabaseId,User::XMLAScript
Modifier le script
Ajoutez une référence à l'assemblage d'objets de gestion de l'analyse (AMO).
Cliquez avec le bouton droit de la souris sur le nom du projet (doit être l'élément le plus haut de l'explorateur de projet dans la fenêtre Visual Studio qui s'est ouverte lorsque vous avez cliqué sur Modifier le script) et sélectionnez Ajouter une référence.
Ajoutez une référence à la composante Objets d'analyse des services. La DLL pour l'amo doit être située dans<SQL Server InstallationDrive>:\Program Files\Microsoft SQL Server\<SQL Server Version>\SDK\Assemblies
.
Dans l'en-tête de script, ajoutez une instruction Imports pour utiliser AMO: Imports Microsoft.AnalysisServices
Remplacez le contenu de Sub Main () avec le script suivant:
Public Sub Main()
'
Dim ASServer As New Microsoft.AnalysisServices.Server()
Dim AsDatabase As New Microsoft.AnalysisServices.Database
Dim ASConn As String = ""
Dim ASDatabaseName As String = ""
Dim ASDatabaseId As String = ""
'Create a variable that uses the dynamic ConnectionString variable
ASConn = Dts.Variables("ConnectionString").Value
'What database are we working with in this iteration of the Foreach?
ASDatabaseName = Dts.Variables("DatabaseName").Value
'Use the Analysis Services AMO to get the DatabaseId for this DatabaseName.
' It is necessary to get the DatabaseId because the XMLA backup command requires the DatabaseId,
' and if at any point the database is renamed, the DatabaseId will differ from the DatabaseName.
Try
'Establish the connection to SSAS.
ASServer.Connect(ASConn)
'Get the database.
AsDatabase = ASServer.Databases.FindByName(ASDatabaseName)
'***ONLY IF the EstimatedSize > 0***.
' --> If it is 0, it could be a corrupted database which causes the backup process to stop.
' --> In that case, we will leave the DatabaseId variable blank to be a visiblie indicator that the db is corrupt.
'***ONLY IF the number of cubes > 0***.
' --> The databse could be corrupt or backup could hang if there are no cubes.
If AsDatabase.EstimatedSize > 0 And AsDatabase.Cubes.Count > 0 Then
'Get the DatabaseId
'Retrieve the DatabaseId from the Databases collection.
ASDatabaseId = ASServer.Databases.FindByName(ASDatabaseName).ID
Else
Dts.Events.FireWarning(0, "Verifying database", "The estimated size and/or number of cubes in the database does not meet the requirements. Estimated Size= " & AsDatabase.EstimatedSize & "; " & "Number of cubes= " & AsDatabase.Cubes.Count, String.Empty, 0)
End If
Catch ex As Exception
'Couldn't connect. Do not error out because maybe the next iteration will succeed.
Dts.Events.FireWarning(0, "Establishing SSAS Connection", "Unable to connect to the SSAS Server with ConnectionString= '" & ASConn & "'. Error: " & ex.ToString, String.Empty, 0)
End Try
'Print info for output while testing/debugging.
Dts.Events.FireInformation(0, "Establishing SSAS Connection", "Connection established. ConnectionString= '" & ASConn & "'.", String.Empty, 0, True)
'Put the DatabaseId into the SSIS variable.
Dts.Variables("DatabaseId").Value = ASDatabaseId
'If we were able to retrieve the DatabaseId, then generate the backup directory and filename and the XMLA script.
If ASDatabaseId <> "" Then
'Print info for output while testing/debugging.
Dts.Events.FireInformation(0, "Retrieving DatabaseId", "DatabaseId retrieved for " & ASDatabaseName & ". DatabaseId= '" & ASDatabaseId & "'.", String.Empty, 0, True)
'Get timestamp for the backup file
Dim timeStamp As String = Now.Year & _
Right("0" & Now.Month, 2) & _
Right("0" & Now.Day, 2) & _
Right("0" & Now.Hour, 2) & _
Right("0" & Now.Minute, 2) & _
Right("0" & Now.Second, 2)
'Get the filename and location for the backupfile
Dim filePath As String = "\\<servershare>\" & Dts.Variables("ServerForDatasource").Value & "\" & ASDatabaseName
Dim fileName As String = ASDatabaseName & "_" & timeStamp & ".abf"
'Put the filepath into the SSIS variable
Dts.Variables("BackupDir").Value = filePath
'Print info for output while testing/debugging
Dts.Events.FireInformation(0, "Retrieving full backup path", "BackupPath= '" & filePath & "\" & fileName & "'.", String.Empty, 0, True)
'Build XMLA script
Dim xmlaScript As String = ""
xmlaScript = "<Backup xmlns=""http://schemas.Microsoft.com/analysisservices/2003/engine"">" & _
"<Object><DatabaseID>" & ASDatabaseId & "</DatabaseID></Object>" & _
"<File>" & filePath & "\" & fileName & "</File>" & _
"</Backup>"
'Put the XMLA script into the SSIS variable
Dts.Variables("XMLAScript").Value = xmlaScript
'Print info for output while testing/debugging.
Dts.Events.FireInformation(0, "Generate XMLAScript", "XMLAScript= '" & xmlaScript & "'.", String.Empty, 0, True)
Else
'Print info for output while testing/debugging.
'If DatabaseId is empty, we will not perform the rest of the tasks in the Foreach container.
Dts.Events.FireWarning(0, "Retrieving DatabaseId", "Unable to retrieve the DatabaseId for Database= '" & ASDatabaseName & "'.", String.Empty, 0)
End If
' Return success
Dts.TaskResult = ScriptResults.Success
End Sub
Il est important de définir UseDirectoryIfExists
sur true
pour éviter une erreur si le répertoire de sauvegarde existe déjà.
Cette contrainte de priorité traitera d'une base de données induite. Le base de données serait manquant si une connexion au serveur SSAS n'a pas pu être établie dans la VBScript ou si la base de données est corrompue. Vous ne voulez pas sauvegarder une base de données corrompue. Cela apportera la sauvegarde à une halte.
Exemple d'expression: `@ [Utilisateur :: DatabayEid]! =" "
InstanceForDatasource
sur le nom de l'instance pour l'étape. [.____]Property Path
: \Package.Variables[User::InstanceForDatasource].Properties[Value]
Notes:
Pour établir la dynamique de la répertoire de sauvegarde entière, vous devez simplement ajouter une autre variable pour cela et en tenir compte dans la VBScript.
Encore une fois, si nécessaire, la variable de chaîne de connexion complète pourrait être définie par le travail d'agent SQL au lieu du nom de l'instance.
Une autre option serait PowerShell SQL Server Analysis Services Sauvegarde dans PowerShell
Je l'ai atteint sans aucun SSIS. J'ai plutôt utilisé un serveur lié. Cela m'a pris du temps, mais je crois toujours que c'est la meilleure façon de sauvegarder les bases de données SSAS.
Vous pouvez voir comment je l'ai fait sur ce lien .
Je supprime également les anciens fichiers de sauvegarde, comme vous pouvez le voir sur ce lien .