Automatische MS SQL Datenbank-Backups mit PowerShell

Ich stand letztens vor der Aufgabe, ein Backup-Mechanismus zu entwerfen, welches verschiedene Datenbanken regelmäßig sichert. Um das zu realisieren und automatisieren, habe ich ein PowerShell-Script entwickelt, dass diese Aufgabe übernehmen soll – Unter Zuhilfnahme des Windows Taskplaners.

$sqlServer = "mySqlServer"
$sqlInstance = "mySqlInstance"
$sqlUsername = "sa"
[ValidateNotNullOrEmpty()] $sqlPassword = "MeinStrenggeheimesPasswort"
$sqlDatabases = @("MeineErsteDatenbank", "DBnummerZWEI", "DritteDB")

####### Perform Microsoft SQL database backup #######

# Create credential object
$sqlPassword = ConvertTo-SecureString -String $sqlPassword -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential ($sqlUsername , $sqlPassword) 

ForEach($sqlDatabase in $sqlDatabases){
    $backupPath = "\\myBackupServer\File Backups\Databases\$($sqlServer)_$sqlDatabase.bak"
    If(Test-Path $backupPath){
        # If a backup file is already existing: Do incremential/differential backup
        Write-Host "Performing differential database backup for $sqlDatabase"
        Backup-SqlDatabase -ServerInstance "$sqlServer\$sqlInstance" -Database $sqlDatabase -Credential $cred -BackupFile $backupPath -Incremental
    }
    else{
        # If no backup file is already existing: Do a full backup
        Write-Host "Performing full database backup for $sqlDatabase"
        Backup-SqlDatabase -ServerInstance "$sqlServer\$sqlInstance" -Database $sqlDatabase -Credential $cred -BackupFile $backupPath
    }
}

Das Script nutzt die SQL Server PowerShell cmdlets um die Backups durchzuführen. Dazu gebe ich ganz oben erstmal die grundsätzlichen Informationen an, die dafür benötigt werden:

  • $sqlServer = Der Hostname des Servers, auf dem Microsoft SQL Server installiert ist
  • $sqlInstance = Die Instanz des SQL-Servers, auf dessen sich die Datenbanken befinden. Wenn Instanzen nicht genutzt werden, kann hier einfach „“ eingetragen werden.
  • $sqlUsername = Der SQL-Benutzer, der die Backup-Tasks ausführt. „sa“ ist üblicherweise der Standard-Serveradmin bei einer regulären MS SQL-Installation. Es kann aber natürlich auch ein alternativer Benutzer gewählt werden. Wichtig ist, das der Benutzer die notwendigen Rechte besitzt, um die SQL-Datenbanken zu sichern.
  • $sqlPassword = Das Password des SQL-Benutzers.
  • $sqlDatabases = Eine Auflistung der Datenbanken, die gesichert werden sollen. In unserem Beispiel sind drei Datenbanknamen eingetragen worden.

Ab hier beginnt die Zauberei.

Das Passwort wird in einen „sicheren String“ konvertiert und dann zusammen mit dem Benutzernamen in ein PSCredential Object gepackt. Anschließend beginnen wir eine Schleife durch alle angegebenen Datenbanken.
Innerhalb der Schleife legen wir den Zielort des Backups fest. In unserem Fall verwenden wir einen UNC-Pfad, um die Backups auf einen Backupserver zu speichern. Mit den Variablen $sqlServer und $sqlDatabase forme ich einen Dateinamen für das Datenbankbackup.
Im nächsten Schritt prüfen wir, ob bereits eine solche Backup-Datei existiert. Ist dies NICHT der Fall, müssen wir auf alle Fälle zuerst ein vollständiges Backup anlegen. Anderfalls reicht ein differentielles Backup. (Achtung: Der PowerShell-Parameter heißt zwar -Incremental, jedoch gibt es in SQL Server keine inkrementellen Backups, sondern lediglich differentielle).
Wichtig: Bevor wir differenzielle Backups erstellen, MUSS immer erst ein vollständiges Backup gemacht werden. Andernfalls sind die Backup-Dateien unbrauchbar und Datenmüll.

Die unterschiede zwischen Vollbackups, inkrementelle Backups und differentielle Backups sind auf dieser Seite sehr gut erklärt: https://www.grundlagen-computer.de/backup/backup-strategien-inkrementell-differentiell-und-vollbackup

Wenn das PowerShell-Script entsprechend parametriert wurde, speichern wir es auf der Festplatte ab. Auf welchem PC/Server wir das Script speichern, ist BEINAHE egal, solang der PC/Server die SQL PowerShell cmdlets besitzt und eine funktionierende Netzwerkverbindung zum SQL-Server und Backup-Server hat. In der Windows Aufgabenplanung (engl. Task Scheduler) richten wir uns eine neue Aufgabe ein, die einmal täglich ausgeführt werden soll. Der ausführende Benutzer muss die entsprechenden Rechte besitzen und ich möchte, das der Benutzer nicht zwingend eingeloggt sein muss. In den auszuführenden Aktionen fügen wir eine neue Aktion mit den folgenden Parametern hinzu:

  • Program/Script: cmd.exe
  • Arguments: /c powershell.exe -file „C:\Scripts\Datenbankbackup.ps1“ -ExecutionPolicy bypass

Anschließend bestätigen wir mit OK. Die Aufgabe wird nun an den eingestellten Zeiten automatisch ausgeführt und dadurch die Datenbanken gesichert. Fertig!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert