sqmSQLTool · Backup & Restore · 2026

Backup & Restore

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.

FULL / DIFF / LOG Ola Hallengren AlwaysOn-aware sqm_BackupExclude Restore-Chain

Uwe Janke · Senior SQL Server DBA · dtcSoftware

Motivation

Warum nicht einfach taglich FULL?

Backup-Fenster schliessen sich

Wachsende Datenbanken bedeuten: ein taegliches FULL-Backup belegt das Wartungsfenster komplett. Kein Platz fuer Integritaetscheck, Indexoptimierung, Statistikupdate.

💾

Storage-Kosten

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.

🚨

Einige Datenbanken benoetigen gar kein Backup

Temporaere Datenbanken, Replicate-Targets, Staging-DBs, Ola-Hilfstools: diese muessen identifiziert und explizit ausgeschlossen werden - nicht versehentlich.

🔄

AlwaysOn: welcher Knoten sichert?

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

FULL + DIFF + LOG

Einmal pro Woche FULL (Sonntag), taeglich DIFF (Mo-Sa), stuendlich LOG. Backup-Fenster schrumpft, RPO sinkt auf <1 h.

So
FULL
✓ LOG
Mo
DIFF
✓ LOG
Di
DIFF
✓ LOG
Mi
DIFF
✓ LOG
Do
DIFF
✓ LOG
Fr
DIFF
✓ LOG
Sa
DIFF
✓ LOG
1 x
FULL pro Woche
Sonntag, 20:00 Uhr. Basis fuer alle Restore-Chains der Woche.
6 x
DIFF pro Woche
Mo-Sa 20:00. Nur geaenderte Seiten - typisch 5-15 % der DB.
24 x
LOG pro Tag
Stuendlich (FULL-Recovery-Modell). RPO: max. 1 Stunde.
Nur FULL
bis 24 h
+ DIFF
max. 1 h*
+ LOG
< 1 h

* DIFF ohne LOG-Backup: Recovery-Punkt = letztes DIFF, kein Point-in-Time moeglich.

Architektur

Zwei Backup-Engines

sqmSQLTool unterstuetzt beide Ansaetze - nativ und ueber Ola Hallengren. Empfehlung: Ola fuer neue Umgebungen.

⚙️

Nativ: New-sqmBackupMaintenanceJob

Erstellt SQL Agent Jobs, die Invoke-sqmUserDatabaseBackup aufrufen. Kein externes Framework notwendig.

BackupTypeFULL | DIFF | LOG
Pfad<BackupDir>\User-Db
Exclude-UseExcludeTable
AlwaysOn-CheckPreferredReplica
Mail-MailTo, -MailOnSuccess
ℹ Pro Job-Typ (FULL/DIFF/LOG) einen separaten Aufruf. Job 1 synct die Exclude-Tabelle, Job 2 fuehrt Backup aus.

Empfohlen: New-sqmOlaUsrDbBackupJob

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)
✓ Ein Aufruf erstellt alle drei Jobs (FULL/DIFF/LOG) inkl. Zeitplaene.
ℹ Ola Hallengren nicht installiert? New-sqmOlaUsrDbBackupJob erkennt das und installiert die Ola-Skripte (DatabaseBackup, CommandLog, DatabaseIntegrityCheck, IndexOptimize) automatisch auf der Zielinstanz.

Einrichtung

New-sqmOlaUsrDbBackupJob

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)TypZeitplanPfad
OlaHH-UserDatabases-FULLFULLSonntag 20:00D:\SQLBackup\Usr-db
OlaHH-UserDatabases-DIFFDIFFMo-Sa 20:00D:\SQLBackup\Usr-db
OlaHH-UserDatabases-LOGLOGStundlichD:\SQLBackup\Usr-db
ℹ Systemdatenbanken (master, model, msdb) werden separat mit New-sqmOlaSysDbBackupJob als FULL gesichert - diese unterstuetzen kein DIFF/LOG.

Selektives Backup

Nur bestimmte Datenbanken sichern

Zwei Ansaetze - je nach Bedarf kombinierbar.

Ansatz 1: Explizite Liste (-Database)

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

Wann -Database verwenden?

  • Wiederherstellungs-Test einer bestimmten DB
  • Notfall-Backup vor einem Patch
  • Migration: Backup auf neuem Pfad testen

Ansatz 2: sqm_BackupExclude-Tabelle

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

master.dbo.sqm_BackupExclude

Vollstaendige Tabellendefinition mit Audit-Trail. Automatisch durch Sync-sqmBackupExcludeTable erstellt und gepflegt.

SpalteTypBedeutung
DatabaseNamesysname PKName der auszuschliessenden DB
Reasonnvarchar(255)Begruendung (z.B. "Staging")
ExcludedBysysnameWer hat ausgeschlossen (SUSER_SNAME())
ExcludedAtdatetime2Wann (Default: SYSDATETIME())
IsActivebit1 = aktiv ausgeschlossen, 0 = reaktiviert
IsOrphanedbit1 = DB existiert nicht mehr auf der Instanz

sqm_BackupExclude_History

Jede Aenderung an der Exclude-Tabelle wird automatisch per Trigger trg_sqm_BackupExclude_Audit in die History-Tabelle geschrieben. Vollstaendige Aenderungshistorie.

Sync-sqmBackupExcludeTable

Laedt regelmaessig die aktuellen Datenbanken der Instanz und markiert geloeschte DBs automatisch als IsOrphaned = 1. Kein manuelles Bereinigen notwendig.

✓ Empfehlung: Sync-sqmBackupExcludeTable als Schritt 1 im Backup-Job einrichten. New-sqmBackupMaintenanceJob macht das automatisch wenn -UseExcludeTable gesetzt ist.

AlwaysOn

AG-aware Backup

Backup-Jobs laufen auf allen AG-Knoten. Ohne Pruefung: Backup laeuft mehrfach oder auf dem falschen Knoten.

Das Problem ohne Pruefung

SQL01 (Primary)Backup laueft
SQL02 (Secondary)Backup laueft ebenfalls
ErgebnisDoppelter Storage-Verbrauch

Losung: -CheckPreferredReplica

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.

Wie es funktioniert

1
Job laeuft auf SQL01 und SQL02

Beide Knoten haben identische Backup-Jobs.

2
Pruefung je Datenbank

fn_hadr_backup_is_preferred_replica('Finanzen') gibt 1 (bevorzugt) oder 0 zurueck.

3
Backup nur auf bevorzugtem Knoten

SQL02 ueberspringt alle AG-Datenbanken wenn SQL01 bevorzugt ist.

4
Failover transparent

Nach Failover auf SQL02 sichert SQL02 - ohne Job-Anpassung.

✓ Funktioniert mit -Full, -Diff und -Log. Ola Hallengren und nativer Engine.
SQL Server 2025: Ab SQL 2025 erlaubt Microsoft erstmals echte FULL-Backups direkt vom Secondary - bisher war nur LOG vom Secondary moeglich. -CheckPreferredReplica beachtet dies automatisch: auf 2025-Instanzen kann der Secondary als Backup-Knoten bevorzugt werden und entlastet so den Primary vollstaendig.

Qualitaet

Backup-Integritaet pruefen

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
ℹ Intern: SQL Server fuhert RESTORE VERIFYONLY FROM DISK = '...' aus. Prueft Checksummen, Dateigroessen und Backup-Header - kein echtes Wiederherstellen.

Was geprueft wird

  • Backup-Header lesbar und vollstaendig
  • Checksummen (wenn beim Backup mit -CheckSum erstellt)
  • Dateigroesse vs. erwartete Groesse
  • Backup-Set-Vollstaendigkeit (kein abgebrochenes Backup)

Empfohlener Einsatz

  • Taeglich nach dem Backup-Fenster als separater Job
  • Nach Storage-Umzug / Robocopy-Lauf
  • Vor einem geplanten Restore-Test
  • -FileListOnly: Inventarisierung aller gesicherten DBs

Restore

Invoke-sqmRestoreDatabase

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'
⚡ Die Reihenfolge in -BackupFiles bestimmt die Restore-Sequenz: erst FULL, dann DIFF, dann LOGs in chronologischer Reihenfolge.

Restore - Features

Was der Restore mitbringt

AlwaysOn-Behandlung

-KeepAlwaysOnDB aus AG entfernen, Restore durchfuehren, danach automatisch wieder hinzufuegen
-RejoinAvailability­GroupNur Wiederaufnahme in die AG nach manuellem Restore (WITH NORECOVERY)
-WithNoRecoveryRestore im NORECOVERY-Modus - fuer mehrstufige Restore-Ketten

Sicherheit & Vorsicht

-BackupBefore­RestoreSichert die Zieldatenbank bevor ueberschrieben wird - Sicherheitsnetz
-ForceSingleUserErzwingt Einzelbenutzermodus wenn aktive Verbindungen vorhanden

Automatische Nachbearbeitung

Nach dem Restore werden automatisch ausgefuehrt:

Orphaned Users reparieren

Verwaiste DB-User werden automatisch mit vorhandenen Logins verknuepft.

Nicht-existente Windows-Logins entfernen

Windows-Logins die im AD nicht (mehr) existieren werden aus der DB entfernt.

DB-Owner auf sa setzen

Sicherheitskonsistenz: Datenbankbesitzer wird auf sa gesetzt.

User-Export optional unterdrucken

-NoUserExport: Benutzer-Wiederherstellung bei reinen Restore-Tests abschalten.

Referenz

Quick Reference

AufgabeFunktion
Backup-Jobs einrichten (Ola)New-sqmOlaUsrDbBackupJob
Backup-Jobs einrichten (nativ)New-sqmBackupMaintenanceJob
Systemdatenbanken sichernNew-sqmOlaSysDbBackupJob
Ad-hoc User-DB sichernInvoke-sqmUserDatabaseBackup
Exclude-Tabelle erstellen/synchSync-sqmBackupExcludeTable
Exclude-Berechtigung setzenSet-sqmBackupExcludePermission
Backup-Datei pruefenTest-sqmBackupIntegrity
Datenbank wiederherstellenInvoke-sqmRestoreDatabase
Parameter-CheatBedeutung
-AllAlle User-DBs (respektiert Exclude-Tabelle)
-DatabaseExplizite DB-Liste
-UseExcludeTablesqm_BackupExclude beachten
-CheckPreferredReplicaAG-aware - nur bevorzugter Knoten
-BackupType DIFFDifferenzial-Backup (nativ)
-DiffDifferenzial-Job anlegen (Ola)
-BackupFilesRestore-Chain (FULL+DIFF+LOG[])
-BackupBeforeRestoreSicherheitsnetz vor Ueberschreiben
ℹ Backup-Pfad-Konvention: <BackupDir>\Usr-db (Ola) vs. <BackupDir>\User-Db (nativ) - bei Neuinstallation auf Einheitlichkeit achten.
sqmSQLTool - Hauptmodul AlwaysOnSetup - AG-Einrichtung SQLSetupTool - Basis-Installation SQLMigration - Datenbankmigrationen

Abgrenzung

Scope & Voraussetzungen

VoraussetzungDetail
SQL Server Version2016 und neuer empfohlen
Recovery-ModellFULL fuer LOG-Backup (sqmSQLTool prueft nicht - DBA-Aufgabe)
Ola HallengrenMuss auf der Instanz installiert sein (DatabaseBackup-SP in msdb oder master)
SQL Server AgentLaeuft und ist erreichbar
Backup-PfadSQL Server Dienst-Konto hat Schreibrechte
AlwaysOnAG-Konfiguration bereits eingerichtet (z.B. via AlwaysOnSetup)
Datenbank-MailOptional - fuer Mail-Benachrichtigung (-MailTo)

Was sqmSQLTool Backup nicht ist

ℹ Kein Backup-Monitoring-Dashboard. sqmSQLTool richtet Jobs ein und fuehrt Backups aus. Erfolgs-Ueberwachung uebernimmt SQL Agent Job-Historie oder Datenbank-Mail.
ℹ Kein Tape/Cloud-Backup. sqmSQLTool sichert auf lokale oder Netzwerk-Pfade. Archivierung auf Tertiaer-Storage ist eine separate Aufgabe.

Recovery-Modell pruefen

-- Vor LOG-Backup sicherstellen:
SELECT name, recovery_model_desc
FROM   sys.databases
WHERE  recovery_model_desc <> 'FULL'
  AND  name NOT IN ('tempdb', 'model')

Zusammenfassung

Einfuehrungsplan

Von Null zur laufenden FULL+DIFF+LOG-Strategie in vier Schritten.

1
Recovery-Modell sicherstellen

Alle zu sichernden Datenbanken auf FULL setzen. Ohne FULL-Recovery kein LOG-Backup moeglich.

2
Exclude-Tabelle initialisieren

Sync-sqmBackupExcludeTable auf jeder Instanz ausfuehren. Staging, Replicate-Targets und temporaere DBs eintragen.

3
Backup-Jobs einrichten

New-sqmOlaUsrDbBackupJob mit -Full -Diff -Log -UseExcludeTable -CheckPreferredReplica -Compress -Verify. Systemdatenbanken separat mit New-sqmOlaSysDbBackupJob.

4
Restore-Test durchfuehren

Invoke-sqmRestoreDatabase -BackupFiles ... auf Testsystem. Backup-Integritaet mit Test-sqmBackupIntegrity bestaetigen.

🏆 Was wir gewinnen

Backup-Fenster-70 % an Mo-Sa durch DIFF statt FULL
RPO< 1 Stunde mit stuendlichem LOG
KontrolleSelektive DBs ohne Job-Anpassung
AlwaysOnEin Job-Set fuer alle AG-Knoten
NachvollziehbarkeitAudit-Trail in sqm_BackupExclude

Relevante Funktionen (8)

New-sqmOlaUsrDbBackupJob New-sqmOlaSysDbBackupJob New-sqmBackupMaintenanceJob Invoke-sqmUserDatabaseBackup Sync-sqmBackupExcludeTable Set-sqmBackupExcludePermission Test-sqmBackupIntegrity Invoke-sqmRestoreDatabase
sqmSQLTool - Hauptmodul AlwaysOnSetup - AG-Einrichtung SQLSetupTool - Basis-Installation SQLMigration - Datenbankmigrationen