Cube Backups inklusive Daten können schnell eine Menge Platz und Zeit in Anspruch einnehmen, insbesondere wenn in einer Instanz mehrere Cube Datenbanken existieren und Backups über eine Zeitspanne hinweg vorgehalten werden sollen. Hinzu kommt, dass die Datenbanken aus denen der Cube seine Daten bezieht meist bereits separat gesichert werden und daher eine gewisse Datenredundanz entsteht. Daher könnte es Sinn machen, statt der gesamten Cubes nur deren Definitionen zu sichern.

Nun könnte der Administrator nächtlich mit Hilfe des Management Studios manuell ein XMLA Skript pro Cube Datenbank erstellen und wegsichern:

image

Wünschenswert ist sicherlich eine Automatisierung dieses Kommandos – am besten mittel eines SSIS Pakets welches zeitgesteuert über einen SQL Server Agent Job ausgeführt werden kann. Ziel ist es also, mittels SSIS ein XMLA Create Skript für alle Datenbanken einer Analysis Services Instanz zu erzeugen. Selbstverständlich nehmen wir für solch eine Aufgabe den SSIS Skript Task.

Im Skript Task bedienen wir uns der beiden Namespaces Microsoft.AnalysisServices für den Zugriff auf die SSAS Instanz und dem Erzeugen des Skripts und System.Xml zum Schreiben der XMLA Datei. Die im Folgenden gezeigten Codeschnipsel sind in C# verfasst – eine VB Variante (z.B. für SSIS 2005) ist natürlich auch denkbar. Zunächst erzeugen wir mit Hilfe der Server Klasse die Verbindung zur SSAS Instanz, in diesem Fall basierend auf einem SSIS Verbindungsmanager:

Microsoft.AnalysisServices.Server server = new Server();
server.Connect(Dts.Connections[“(localhost)”].ConnectionString);

Anschließend kann die Database Klasse genutzt werden um eine bestimmte Datenbank oder alle Datenbanken einer Instanz in einer Schleife anzusprechen. Zusätzlich nutzen wir die XmlTextWriter Klasse um eine Ausgabedatei im XML Format bereit zu stellen:

System.Xml.XmlTextWriter xmlwriter = new System.Xml.XmlTextWriter(backupfile, System.Text.Encoding.UTF8);
xmlwriter.Formatting = System.Xml.Formatting.Indented;
xmlwriter.Indentation = 4;

Jetzt kommt der eigentliche Knackpunkt: die Erzeugung des XMLS Skripts. Dabei hilft die Scripter Klasse. Mit Hife dieser Klasse lassen sich Skripte zur Erstellung, Löschung oder Veränderung beliebiger SSAS Objekte erstellen. In unserem Fall wenden wir daher die WriteCreate Methode auf eine Database eines Servers an. Als Ziel dient dabei der XmlTextWriter:

Microsoft.AnalysisServices.Scripter.WriteStartBatch(xmlwriter, true);
Microsoft.AnalysisServices.Scripter.WriteStartParallel(xmlwriter);
Microsoft.AnalysisServices.Scripter.WriteCreate(xmlwriter, server, database, true, true);
Microsoft.AnalysisServices.Scripter.WriteEndParallel(xmlwriter);
Microsoft.AnalysisServices.Scripter.WriteEndBatch(xmlwriter);

Und fertig ist das automatisch erzeugte XMLA Skript zur Erzeugung einer gesamten Cube Datenbank! Als zusätzlichen Überbau wäre es wie gesagt denkbar eine Schleife über alle Datenbanken einer Instanz hinzuzufügen. Weiterhin sollte man den Pfad zur Backupdatei mit dem Namen der Datenbank und einem Zeitstempel versehen, sowie dafür sorgen, dass ältere Backups regelmäßig entfernt werden. Ein komplettes Restore kann anschließend jederzeit aus dem Backup der Definition, dem Backup der relationalen Quelldatenbank und dem anschließenden Aufbereiten der Cube Datenbank erfolgen.

Natürlich habe ich hier nur die wichtigsten Codeschnipsel gezeigt, der Rest ist aber keinesfalls Raketenwissenschaft – auf Anfrage helfe ich aber auch gerne weiter bei der Komplettierung des Skriptes!