sqmSQLTool · Backup & Restore · 2026
FULL + DIFF + LOG. Selektiv. AlwaysOn-aware.
Die sqmSQLTool-Backup-Strategie: Tagesbackups als Differenzial, selektive Sicherung einzelner Datenbanken, automatische AG-Erkennung und strukturierter Restore in einem Rutsch.
Uwe Janke · Senior SQL Server DBA · dtcSoftware
Motivation
Wachsende Datenbanken bedeuten: ein taegliches FULL-Backup belegt das Wartungsfenster komplett. Kein Platz fuer Integritaetscheck, Indexoptimierung, Statistikupdate.
7 x FULL pro Woche = 7 x die volle Datenbankgroesse. Mit DIFF + LOG werden Montag bis Samstag nur die geaenderten Seiten gesichert - meist 5-15 % der DB-Groesse.
Temporaere Datenbanken, Replicate-Targets, Staging-DBs, Ola-Hilfstools: diese muessen identifiziert und explizit ausgeschlossen werden - nicht versehentlich.
In einer AG laufen Backup-Jobs auf allen Knoten. Ohne preferred-Replica-Pruefung laeuft das Backup mehrfach - oder gar nicht, wenn der aktive Knoten wechselt.
Strategie
Einmal pro Woche FULL (Sonntag), taeglich DIFF (Mo-Sa), stuendlich LOG. Backup-Fenster schrumpft, RPO sinkt auf <1 h.
* DIFF ohne LOG-Backup: Recovery-Punkt = letztes DIFF, kein Point-in-Time moeglich.
Architektur
sqmSQLTool unterstuetzt beide Ansaetze - nativ und ueber Ola Hallengren. Empfehlung: Ola fuer neue Umgebungen.
Erstellt SQL Agent Jobs, die Invoke-sqmUserDatabaseBackup aufrufen. Kein externes Framework notwendig.
| BackupType | FULL | DIFF | LOG |
| Pfad | <BackupDir>\User-Db |
| Exclude | -UseExcludeTable |
| AlwaysOn | -CheckPreferredReplica |
-MailTo, -MailOnSuccess |
Erstellt Jobs auf Basis von Ola Hallengrens DatabaseBackup-Prozedur. Industrie-Standard, umfangreiche Optionen.
| Schalter | -Full -Diff -Log |
| Pfad | <BackupDir>\Usr-db |
| Exclude | -UseExcludeTable |
| Qualitaet | -Compress, -Verify, -CheckSum |
| Protokoll | -LogToTable (msdb) |
New-sqmOlaUsrDbBackupJob erkennt das und installiert die Ola-Skripte (DatabaseBackup, CommandLog, DatabaseIntegrityCheck, IndexOptimize) automatisch auf der Zielinstanz.Einrichtung
Ein einziger PowerShell-Aufruf richtet die komplette FULL/DIFF/LOG-Job-Struktur auf einer Instanz ein.
# Vollstaendige Einrichtung: FULL (So 20:00) + DIFF (Mo-Sa 20:00) + LOG (stundlich)
New-sqmOlaUsrDbBackupJob -SqlInstance 'SQL01\PROD' `
-BackupDirectory 'D:\SQLBackup' `
-Full -FullScheduleTime '20:00' -FullScheduleDays @('Sunday') `
-Diff -DiffScheduleTime '20:00' -DiffScheduleDays @('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') `
-Log -LogScheduleIntervalMinutes 60 `
-UseExcludeTable `
-Compress -Verify -CheckSum -LogToTable
Erstellte SQL Agent Jobs:
| Job-Name (Konfigurierbar) | Typ | Zeitplan | Pfad |
|---|---|---|---|
OlaHH-UserDatabases-FULL | FULL | Sonntag 20:00 | D:\SQLBackup\Usr-db |
OlaHH-UserDatabases-DIFF | DIFF | Mo-Sa 20:00 | D:\SQLBackup\Usr-db |
OlaHH-UserDatabases-LOG | LOG | Stundlich | D:\SQLBackup\Usr-db |
New-sqmOlaSysDbBackupJob als FULL gesichert - diese unterstuetzen kein DIFF/LOG.Selektives Backup
Zwei Ansaetze - je nach Bedarf kombinierbar.
Direkt im Funktionsaufruf - fuer Ad-hoc oder einmalige Sicherungen.
# Nur zwei Datenbanken sichern
Invoke-sqmUserDatabaseBackup `
-SqlInstance 'SQL01' `
-Database 'Finanzen', 'Controlling' `
-BackupPath 'D:\SQLBackup\User-Db'
# Alle ausser Exclude-Tabelle sichern
Invoke-sqmUserDatabaseBackup `
-SqlInstance 'SQL01' `
-All `
-UseExcludeTable
Persistente Ausschlussliste in master. Aenderungen gelten sofort fuer alle Backup-Jobs - keine Job-Anpassung notwendig.
# Tabelle initialisieren (einmalig)
Sync-sqmBackupExcludeTable `
-SqlInstance 'SQL01'
# Datenbank ausschliessen
INSERT INTO master.dbo.sqm_BackupExclude
(DatabaseName, Reason)
VALUES ('StagingDB', 'Kein Backup - taeglich neu befuellt')
# Lesezugriff fuer Backup-Dienst-Konto
Set-sqmBackupExcludePermission `
-SqlInstance 'SQL01' `
-LoginName 'DOMAIN\sqlsvc'
Selektives Backup - Detail
Vollstaendige Tabellendefinition mit Audit-Trail. Automatisch durch Sync-sqmBackupExcludeTable erstellt und gepflegt.
| Spalte | Typ | Bedeutung |
|---|---|---|
DatabaseName | sysname PK | Name der auszuschliessenden DB |
Reason | nvarchar(255) | Begruendung (z.B. "Staging") |
ExcludedBy | sysname | Wer hat ausgeschlossen (SUSER_SNAME()) |
ExcludedAt | datetime2 | Wann (Default: SYSDATETIME()) |
IsActive | bit | 1 = aktiv ausgeschlossen, 0 = reaktiviert |
IsOrphaned | bit | 1 = DB existiert nicht mehr auf der Instanz |
Jede Aenderung an der Exclude-Tabelle wird automatisch per Trigger trg_sqm_BackupExclude_Audit in die History-Tabelle geschrieben. Vollstaendige Aenderungshistorie.
Laedt regelmaessig die aktuellen Datenbanken der Instanz und markiert geloeschte DBs automatisch als IsOrphaned = 1. Kein manuelles Bereinigen notwendig.
Sync-sqmBackupExcludeTable als Schritt 1 im Backup-Job einrichten. New-sqmBackupMaintenanceJob macht das automatisch wenn -UseExcludeTable gesetzt ist.AlwaysOn
Backup-Jobs laufen auf allen AG-Knoten. Ohne Pruefung: Backup laeuft mehrfach oder auf dem falschen Knoten.
| SQL01 (Primary) | Backup laueft |
| SQL02 (Secondary) | Backup laueft ebenfalls |
| Ergebnis | Doppelter Storage-Verbrauch |
Invoke-sqmUserDatabaseBackup `
-SqlInstance 'SQL01' `
-All `
-CheckPreferredReplica `
-UseExcludeTable
Prueft intern sys.fn_hadr_backup_is_preferred_replica() je AG-Datenbank. Nicht-bevorzugte Replikate ueberspringen die Datenbank stillschweigend.
Beide Knoten haben identische Backup-Jobs.
fn_hadr_backup_is_preferred_replica('Finanzen') gibt 1 (bevorzugt) oder 0 zurueck.
SQL02 ueberspringt alle AG-Datenbanken wenn SQL01 bevorzugt ist.
Nach Failover auf SQL02 sichert SQL02 - ohne Job-Anpassung.
-CheckPreferredReplica beachtet dies automatisch: auf 2025-Instanzen kann der Secondary als Backup-Knoten bevorzugt werden und entlastet so den Primary vollstaendig.Qualitaet
Test-sqmBackupIntegrity - RESTORE VERIFYONLY ohne tatsaechlichen Restore. Erkennt korrupte Backup-Dateien bevor sie gebraucht werden.
# Alle Backup-Dateien in einem Pfad pruefen
Test-sqmBackupIntegrity `
-SqlInstance 'SQL01' `
-BackupPath 'D:\SQLBackup\User-Db'
# Dateiliste (Header-Info) ausgeben
Test-sqmBackupIntegrity `
-SqlInstance 'SQL01' `
-BackupPath 'D:\SQLBackup\User-Db' `
-FileListOnly
RESTORE VERIFYONLY FROM DISK = '...' aus. Prueft Checksummen, Dateigroessen und Backup-Header - kein echtes Wiederherstellen.-CheckSum erstellt)-FileListOnly: Inventarisierung aller gesicherten DBsRestore
Vollstaendiger Restore-Workflow - von der einzelnen Backup-Datei bis zur FULL+DIFF+LOG-Chain. AlwaysOn-aware.
# Einfacher Restore aus einer Datei
Invoke-sqmRestoreDatabase `
-SqlInstance 'SQL01' `
-BackupFile 'D:\SQLBackup\User-Db\Finanzen_FULL_20260518.bak'
# Restore-Chain: FULL + DIFF + LOG (Point-in-Time)
Invoke-sqmRestoreDatabase `
-SqlInstance 'SQL01' `
-BackupFiles 'D:\Backup\Finanzen_FULL.bak',
'D:\Backup\Finanzen_DIFF.bak',
'D:\Backup\Finanzen_LOG_10.trn',
'D:\Backup\Finanzen_LOG_11.trn' `
-NewDatabaseName 'Finanzen_Restore_Test' `
-NewDatabaseFilePath 'E:\MSSQL\DATA' `
-NewLogFilePath 'F:\MSSQL\LOG'
-BackupFiles bestimmt die Restore-Sequenz: erst FULL, dann DIFF, dann LOGs in chronologischer Reihenfolge.Restore - Features
-KeepAlwaysOn | DB aus AG entfernen, Restore durchfuehren, danach automatisch wieder hinzufuegen |
-RejoinAvailabilityGroup | Nur Wiederaufnahme in die AG nach manuellem Restore (WITH NORECOVERY) |
-WithNoRecovery | Restore im NORECOVERY-Modus - fuer mehrstufige Restore-Ketten |
-BackupBeforeRestore | Sichert die Zieldatenbank bevor ueberschrieben wird - Sicherheitsnetz |
-ForceSingleUser | Erzwingt Einzelbenutzermodus wenn aktive Verbindungen vorhanden |
Nach dem Restore werden automatisch ausgefuehrt:
Verwaiste DB-User werden automatisch mit vorhandenen Logins verknuepft.
Windows-Logins die im AD nicht (mehr) existieren werden aus der DB entfernt.
Sicherheitskonsistenz: Datenbankbesitzer wird auf sa gesetzt.
-NoUserExport: Benutzer-Wiederherstellung bei reinen Restore-Tests abschalten.
Referenz
| Aufgabe | Funktion |
|---|---|
| Backup-Jobs einrichten (Ola) | New-sqmOlaUsrDbBackupJob |
| Backup-Jobs einrichten (nativ) | New-sqmBackupMaintenanceJob |
| Systemdatenbanken sichern | New-sqmOlaSysDbBackupJob |
| Ad-hoc User-DB sichern | Invoke-sqmUserDatabaseBackup |
| Exclude-Tabelle erstellen/synch | Sync-sqmBackupExcludeTable |
| Exclude-Berechtigung setzen | Set-sqmBackupExcludePermission |
| Backup-Datei pruefen | Test-sqmBackupIntegrity |
| Datenbank wiederherstellen | Invoke-sqmRestoreDatabase |
| Parameter-Cheat | Bedeutung |
|---|---|
-All | Alle User-DBs (respektiert Exclude-Tabelle) |
-Database | Explizite DB-Liste |
-UseExcludeTable | sqm_BackupExclude beachten |
-CheckPreferredReplica | AG-aware - nur bevorzugter Knoten |
-BackupType DIFF | Differenzial-Backup (nativ) |
-Diff | Differenzial-Job anlegen (Ola) |
-BackupFiles | Restore-Chain (FULL+DIFF+LOG[]) |
-BackupBeforeRestore | Sicherheitsnetz vor Ueberschreiben |
<BackupDir>\Usr-db (Ola) vs. <BackupDir>\User-Db (nativ) - bei Neuinstallation auf Einheitlichkeit achten.Abgrenzung
| Voraussetzung | Detail |
|---|---|
| SQL Server Version | 2016 und neuer empfohlen |
| Recovery-Modell | FULL fuer LOG-Backup (sqmSQLTool prueft nicht - DBA-Aufgabe) |
| Ola Hallengren | Muss auf der Instanz installiert sein (DatabaseBackup-SP in msdb oder master) |
| SQL Server Agent | Laeuft und ist erreichbar |
| Backup-Pfad | SQL Server Dienst-Konto hat Schreibrechte |
| AlwaysOn | AG-Konfiguration bereits eingerichtet (z.B. via AlwaysOnSetup) |
| Datenbank-Mail | Optional - fuer Mail-Benachrichtigung (-MailTo) |
-- Vor LOG-Backup sicherstellen:
SELECT name, recovery_model_desc
FROM sys.databases
WHERE recovery_model_desc <> 'FULL'
AND name NOT IN ('tempdb', 'model')
Zusammenfassung
Von Null zur laufenden FULL+DIFF+LOG-Strategie in vier Schritten.
Alle zu sichernden Datenbanken auf FULL setzen. Ohne FULL-Recovery kein LOG-Backup moeglich.
Sync-sqmBackupExcludeTable auf jeder Instanz ausfuehren. Staging, Replicate-Targets und temporaere DBs eintragen.
New-sqmOlaUsrDbBackupJob mit -Full -Diff -Log -UseExcludeTable -CheckPreferredReplica -Compress -Verify. Systemdatenbanken separat mit New-sqmOlaSysDbBackupJob.
Invoke-sqmRestoreDatabase -BackupFiles ... auf Testsystem. Backup-Integritaet mit Test-sqmBackupIntegrity bestaetigen.
| Backup-Fenster | -70 % an Mo-Sa durch DIFF statt FULL |
| RPO | < 1 Stunde mit stuendlichem LOG |
| Kontrolle | Selektive DBs ohne Job-Anpassung |
| AlwaysOn | Ein Job-Set fuer alle AG-Knoten |
| Nachvollziehbarkeit | Audit-Trail in sqm_BackupExclude |