Die SQL Express Edition erfreut sich gerade für kleine Anwendungen großer Beliebtheit, da sie keine Lizenzkosten verursacht. Diese Beliebtheit dürfte sogar noch steigen seit dem Microsoft mit dem Service Pack 1 für den SQL Server 2016 viele Funktionen der Standard und sogar Enterprise Edition nun auch in der Express Edition verfügbar macht. Nun stehen hier auch viele der In-Memory Features und Sicherheitsfunktionen wie AlwaysEncrypted auch in der Express Edition bereit. Informationen zu allen Neuerungen in der Express Edition findet man in der offiziellen Ankündigung unter https://blogs.msdn.microsoft.com/sqlreleaseservices/sql-server-2016-service-pack-1-sp1-released/
Der Agent
Etwas, was aber weiterhin nur eingeschränkt enthalten ist, ist der SQL Server Agent. Dadurch muss man sich Alternativen überlegen, wie man zeitgesteuerte Aufgaben abbilden kann. Dieser Umstand wird gerade für die Sicherungen der Datenbank zum Problem. Mit den Bordmitteln des SQL Server Express gibt es erstmal keine Möglichkeit seine Datenbanken automatisch zu sichern.
Bei der Suche im Internet findet man häufig die Vorgehensweise die Datenbank Datei direkt zu sichern indem man die mdf-Datei kopiert. Der Nachteil an dieser Methode ist aber, dass der SQL Server Dienst für den Zeitraum der Sicherung nicht laufen darf, da sonst die Datei(en) noch im Zugriff sind. Ein weiterer Nachteil ist zudem, dass man die Datenbank nur im Wiederherstellungsmodel „Einfach“ betreiben kann da eine Log Sicherung und damit das leeren des Transaktionslogs nicht möglich ist.
Alternative Powershell
Microsoft stellt aber mit der Powershell eine einfache Möglichkeit bereit wie man auch in der Express Edition seine Datenbanken sichern kann.
Hierfür braucht man lediglich ein kleines Powershell-Skript und den Aufgabenplaner von Windows, und fertig ist die Sicherungslösung. Hier habe ich ein Beispiel für ein solches Sicherungsskript erstellt.
<#—————————————————————–
Datensicherung von SQL Datenbanken über die Powershell
Autor Benjamin Hoch
Version 1.0 Datum: 12.12.2016
——————————————————————#>
# Variablen Definieren und Werte zuweisen
$Server= ‚SERVER' # Servername des Windows Servers
$Instanz= ‚INSTANZ' # Instanz Name des SQL Servers
$Zielpfad= ‚c:\temp\backup\' # Zielpfad der Sicherungsdateien
# Zeitstempel erzeugen
$date = Get-Date -Format o | foreach {$_ -replace ‚:', ‚.'}
# Auslesen aller Datenbanken außer TempDB und Variable zuweisen
$dbs= dir sqlserver:\sql\$Server\$Instanz\databases -force | Where-Object {$_.name -notlike ‚tempdb'}
# Backup Ordner erzeugen sofern nicht vorhanden
if(!(test-path $zielpfad)){New-Item $zielpfad -ItemType directory}
# Backup aller Datenbanken
$dbs | foreach-object {Backup-SqlDatabase -ServerInstance $server\$Instanz -Database $_.name -BackupFile „$zielpfad\$_$date.bak"}
Das Skript sichert alle Datenbanken außer der TempDB in das angegebene Zielverzeichnis. Für jede Datenbank wird ein eigener Unterordner erstellt und jede Sicherungsdatei erhält einen eindeutigen Zeitstempel.
Das Skript speichert man ab und ruft es über den Aufgabenplaner von Windows im gewünschten Intervall auf.
Transaktionslog-Sicherung
Um eine Transaktionslog-Sicherung für eine bestimmte Datenbank durchzuführen, nutzt man einen zusätzlichen Parameter.
<#—————————————————————–
Logsicherung von einer SQL Datenbank über die Powershell
Autor Benjamin Hoch
Version 1.0 Datum: 12.12.2016
——————————————————————#>
# Variablen Definieren und Werte zuweisen
$Server= ‚SERVER' # Servername des Windows Servers
$Instanz= ‚INSTANZ' # Instanz Name des SQL Servers
$Zielpfad= ‚c:\temp\backup\' # Ziel der Sicherung
$Datenbank =‚meinedb'
# Zeitstempel erzeugen
$date = Get-Date -Format o | foreach {$_ -replace ‚:', ‚.'}
Backup-SqlDatabase -ServerInstance $Server\$Instanz -Database $Datenbank -BackupAction Log -BackupFile „$zielpfad\$datenbank–$date.trn“
Aufgabe erstellen
Im Windows-Aufgabenplaner erstellt man nun eine neue Aufgabe für die Sicherung. Im Reiter „Aktionen“ wählt man „Programm starten“ aus und wählt als Programm die Powershell.exe aus. Diese findet man im typischerweise in folgendem Verzeichnis:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
Bei „Argumente hinzufügen“ gibt man nun den Pfad und den Namen des Powershell-Skriptes an, welches ausgeführt werden soll.
Fertig ist die Sicherung der SQL Server Datenbanken.
Es ist natürlich auch möglich, in derselben Aufgabe mehrere Aktionen zu planen. Hierdurch kann man in einer Aktion die tägliche/wöchentliche Vollsicherung aller Datenbanken planen und in einer anderen Aktion die stündliche Transaktionslog-Sicherung für eine bestimmte Datenbank.
Hinweis
Die Beispielskripte entfernen keine alten Sicherungen. Es ist daher notwendig die alten Sicherungen von Zeit zu Zeit händisch/automatisch zu löschen.
Die Skripte sind mit der Powershell 5 auf Windows Server 2012 R2 und 2016 mit SQL Express 2014 getestet.