web-dev-qa-db-fra.com

Comment sauvegarder dynamiquement toutes les bases de données SSAS sur une instance donnée?

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:

4
dev_etter

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:

  1. Un travail d'agent SQL avec une étape pour chaque instance qui a besoin de sauvegarde (c'est-à-dire une étape pour le serveur de développement, le serveur QA et pour la production).
  2. Un package SSIS dynamique appelé à chaque étape du travail.
  3. Une Execute Script Task qui utilise les Objets de gestion d'analyse (AMO) .

Créer le paquet SSIS

Variables

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

    • Destiné à être utilisé dans l'onglet Valeurs définies du travail de l'agent SQL si plusieurs instances seront sauvegardées. Cette variable sera utilisée pour construire les connexions.
  • 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

Gestionnaires de connexion

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

  1. Créez un nouveau gestionnaire de connexions ADO.NET qui utilise le fichier Microsoft OLE DB fournisseur de services d'analyse
  2. Utilisation de l'éditeur de propriétés Expressions, définissez la propriété ConnectionsRing comme suit: [User::ConnectionString]

OLEDB

  1. Créez un nouveau gestionnaire de connexion OLDED qui utilise Microsoft OLE DB pour le service d'analyse
  2. Utilisation de l'éditeur de propriétés Expressions, définissez la propriété ConnectionsRing comme suit: [User::ConnectionString] + "Format=Tabular;"

Services d'analyse

  1. Créer une nouvelle connexion des services d'analyse
  2. Utilisation de l'éditeur de propriétés Expressions, définissez la propriété ConnectionsRing comme suit: [User::ConnectionString] = "Impersonation Level=Impersonate;"

Créer le conteneur foreach

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.] ==

Foreach Container configurationForeach Container variable mappings

Créer une tâche d'exécution de script

Définissez le script pour utiliser Visual Basic.

Définissez les readonlyvariables et ReadwriteVariables comme suit:

  • ReadonlyVariables: User::ConnectionString,User::DatabaseName,User::InstanceForDatasource
  • ReadwriteVariables: 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
    

Créer une tâche système de fichiers (pour créer le répertoire de sauvegarde)

Il est important de définir UseDirectoryIfExists sur true pour éviter une erreur si le répertoire de sauvegarde existe déjà.

File System Task Editor

Modifiez la contrainte de préséance entre la tâche de script exécuté et la tâche du système de fichiers

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.

Precedence Constraint Editor

Exemple d'expression: `@ [Utilisateur :: DatabayEid]! =" "

Créer une analyse des services d'analyse EXECUTE DDL

Analysis Services DDL Task

Votre flux de contrôle final devrait ressembler à ceci :

Final Control Flow


Créer le travail de l'agent SQL

  1. Ajoutez une étape pour chaque instance SSAS qui sera sauvegardée.
  2. Chaque étape doit être configurée pour exécuter le package SSIS.
  3. Pour chaque étape, cliquez sur l'onglet Set Valeurs et définissez la valeur de InstanceForDatasource sur le nom de l'instance pour l'étape. [.____]

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.

9
dev_etter
1
Kin Shah

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 .

0
Marcello Miorelli