Wie bereits in meinem Blog Post "Datensicherung unter SQL Azure" vorgestellt, gibt es verschiedene Optionen, manuelle Datensicherungen durchführen zu können.
Wie man dies automatisieren kann, werde ich in diesem Blog Post vorstellen.
Das Backup Tool
Um die Datensicherung durchführen zu können, verwende ich das Kommandozeilentool, dass mit SQL Azure Backup (Red Gate) mitgeliefert wird:
Um genau zu sein, soll ein Backup, in Form einer BACPAC Datei, durchgeführt werden.
Diese wird dann im Windows Azure Storage gespeichert.
Windows Azure Startup Task
Für die Automatisierung habe ich ein Windows Azure Startup Task Skript erstellt, welches folgende Schritte ausführt:
-
Bei Ausführung innerhalb des Compute Emulator’s, wird das Skript sofort beendet
(siehe auch Windows Azure Startup Tasks im Emulatorbetrieb unterbinden) -
Kopiert das SQL Azure Backup Tool an einen bekannten Ort auf der System Festplatte.
Dies ist nötig, da bei jedem Update der Windows Azure Rolle, der Applikations-
laufwerksbuchstabe zwischen E: und F: wechselt. -
Erzeugen eines Skriptes für das Kommandozeilentool
Hierzu werden die Cloud-Projekteinstellungen, mittels des "xPath Values" Features, in Umgebungsvariablen übertragen und anschließend in das Backupskript eingefügt. -
Konfigurieren & Starten des Task Schedulers
Der Task Scheduler ist standardmäßig nicht aktiviert.
Deshalb wird dieser auf "Autostart" gestellt und gestartet. -
90 Sekunden warten…
Bei meinen ersten Versuchen, konnte dem Task Scheduler kein Task hinzugefügt werden, da dieser noch nicht gestartet war.
Auch die (in Schritt 6) verwendete Warteschleife, erbrachte keinen Erfolg. -
Das Backupskript wird als Neue Aufgabe im Task Scheduler hinzugefügt
(siehe auch Schtasks.exe)
Zur Sicherheit habe ich die Warteschleife nicht entfernt.
Hier das Startupskript (RegisterBackupTask.cmd):
@echo off REM Nicht im Emulator ausfuehren if "%TestIsEmulated%"=="true" goto :EOF REM Kopiere das SQL Azure Backup Tool an einen bekannten Ort auf der System Festplatte md "%ProgramFiles%RedGate" copy "%~dp0RedGate.SQLAzureBackupCommandLine.exe" "%ProgramFiles%RedGate." >> log.txt 2>> err.txt REM Erzeuge Backup Skript echo @"%ProgramFiles%RedGateRedGate.SQLAzureBackupCommandLine.exe" /AzureServer:"%SqlAzureServer%" /AzureDatabase:"%SqlAzureDatabase%" /AzureUserName:"%SqlAzureUserName%" /AzurePassword:"%SqlAzurePassword%" /StorageAccount:"%StorageAccount%" /AccessKey:"%StorageAccessKey%" /Container:"%StorageContainer%" /Filename:"CloudBlog-%%date:~-4,4%%%%date:~-10,2%%%%date:~-7,2%%-%%time:~0,2%%%%time:~3,2%%.bacpac" > "%ProgramFiles%RedGateRunSqlBackup.cmd" REM Konfiguriere & Starte den Task Scheduler sc config Schedule start= auto >> log.txt 2>> err.txt sc start Schedule >> log.txt 2>> err.txt REM Dem Task Scheduler etwas Zeit zum Starten geben TIMEOUT /T 90 REM Warte bis der Task Scheduler gestartet ist for /F "tokens=3 delims=: " %%H in ('sc query "Schedule" ^| findstr " STATE"') do ( if /I "%%H" EQU "RUNNING" ( REM Fuege das SQL Azure Backup dem Task Scheduler hinzu SCHTASKS /Create /SC WEEKLY /D "%ScheduleEvery%" /ST "%ScheduleAt%" /TN SqlAzureBackup /TR '"%ProgramFiles%RedGateRunSqlBackup.cmd"' /RU SYSTEM /F /RL HIGHEST >> log.txt 2>> err.txt ) )
Sowie die Änderungen an der ServiceDefinition.csdef:
<ServiceDefinition name="SqlAzureDatensicherungDemo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WorkerRole name="DummyRole" vmsize="ExtraSmall"> <Startup> <Task commandLine="StartupRegisterBackupTask.cmd" executionContext="elevated" taskType="background"> <Environment> <Variable name="SqlAzureServer"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='SqlAzureServer']/@value" /> </Variable> <Variable name="SqlAzureDatabase"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='SqlAzureDatabase']/@value" /> </Variable> <Variable name="SqlAzureUserName"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='SqlAzureUserName']/@value" /> </Variable> <Variable name="SqlAzurePassword"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='SqlAzurePassword']/@value" /> </Variable> <Variable name="StorageAccount"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='StorageAccount']/@value" /> </Variable> <Variable name="StorageAccessKey"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='StorageAccessKey']/@value" /> </Variable> <Variable name="StorageContainer"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='StorageContainer']/@value" /> </Variable> <Variable name="ScheduleEvery"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='ScheduleEvery']/@value" /> </Variable> <Variable name="ScheduleAt"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='ScheduleAt']/@value" /> </Variable> <Variable name="TestIsEmulated"> <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> </Variable> </Environment> </Task> </Startup> <Imports> <Import moduleName="Diagnostics" /> </Imports> <ConfigurationSettings> <Setting name="SqlAzureServer" /> <Setting name="SqlAzureDatabase" /> <Setting name="SqlAzureUserName" /> <Setting name="SqlAzurePassword" /> <Setting name="StorageAccount" /> <Setting name="StorageAccessKey" /> <Setting name="StorageContainer" /> <Setting name="ScheduleEvery" /> <Setting name="ScheduleAt" /> </ConfigurationSettings> </WorkerRole> </ServiceDefinition>
Konfiguration des Startupskripts
Um (von Außen) das Startupskript konfigurieren zu können, habe ich viele Parameter des Skriptes in die Cloud-Projekteinstellungen ausgelagert:
Download der Beispielanwendung:
Weitere Informationen unter: |