Montag , 14 Oktober 2019

Automatisierte Backups von SQL Azure Datenbanken

SQL Azure LogoWie 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:

SQL Azure Backup - Kommandozeilentool

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:

  1. Bei Ausführung innerhalb des Compute Emulator’s, wird das Skript sofort beendet
    (siehe auch Windows Azure Startup Tasks im Emulatorbetrieb unterbinden)
  2. 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.
  3. 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.
  4. Konfigurieren & Starten des Task Schedulers
    Der Task Scheduler ist standardmäßig nicht aktiviert.
    Deshalb wird dieser auf "Autostart" gestellt und gestartet.
  5. 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.
  6. 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:

SQL Azure Backup - Cloud-Projekteinstellungen

 


Download Download der Beispielanwendung:

 

Weitere Informationen unter: