SQL Server Backup-Strategien
FULL, DIFF, LOG – RPO & RTO
Ein strukturierter Leitfaden zu allen SQL Server Backup-Typen, Recovery-Modellen und den Kennzahlen RPO und RTO. Mit konkreten Empfehlungen für die Praxis, dbaTools-Beispielen und einer vollständigen Betrachtung von Backup-Optimierung mit AlwaysOn Availability Groups.
Grundlagen – Warum Backups mehr als Pflicht sind
Ein SQL Server-Backup ist nicht nur eine gesetzliche oder regulatorische Anforderung – es ist die einzige verlässliche Absicherung gegen Datenverlust durch Hardware-Ausfall, menschliche Fehler, Ransomware oder logische Datenbankkorruption. AlwaysOn Availability Groups schützen vor Ausfällen, aber sie replizieren auch Fehler in Echtzeit. Ein Backup ist unersetzlich.
DELETE ohne WHERE wird sofort auf alle Replikate
synchronisiert – ohne Point-in-Time-Recovery durch LOG-Backups ist die Tabelle unwiederbringlich verloren.
FULL / DIFF / LOG
SIMPLE / BULK / FULL
Datenverlust
Ausfallzeit
Die drei Backup-Säulen auf einen Blick
FULL Backup
Vollständige Kopie aller Datenbankdaten. Basis jeder Restore-Kette. Enthält alle Daten zum Backup-Zeitpunkt.
Wöchentlich / täglichDIFFERENTIAL
Alle seit dem letzten FULL geänderten Extents. Kleiner als FULL, schneller als Restore über viele LOGs.
Täglich / stündlichLOG Backup
Transaktionsprotokoll seit letztem LOG-Backup. Ermöglicht Point-in-Time-Recovery. Kürzt das Transaktionslog.
Minütlich / stündlichRecovery-Modelle – Die Basis der Strategie
Das Recovery-Modell einer Datenbank bestimmt, welche Backup-Typen möglich sind und wie das Transaktionsprotokoll verwaltet wird. Es ist die wichtigste Einstellung vor jeder Backup-Planung.
| Recovery-Modell | LOG-Verwaltung | LOG-Backup | Point-in-Time | Log-Wachstum | Einsatz |
|---|---|---|---|---|---|
| SIMPLE | Automatisch nach Checkpoint freigegeben | Nicht möglich | Nein | Unkritisch | Dev/Test, kleine Datenbanken, DWH-Staging |
| BULK_LOGGED | Minimale Protokollierung für Bulk-Ops | Eingeschränkt | Eingeschränkt | Moderat | Bulk-Import-Phasen (temporär wechseln) |
| FULL | Nur durch LOG-Backup freigegeben | Ja (Pflicht!) | Ja | Unbegrenzt ohne LOG-Backups | Alle Produktionsdatenbanken |
-- Recovery-Modell aller Datenbanken anzeigen
SELECT name, recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
ORDER BY name;
-- Auf FULL umstellen (Produktionsdatenbank)
ALTER DATABASE [AppDB] SET RECOVERY FULL;
-- Wichtig: Danach sofort ein FULL-Backup erzeugen!
-- Erst ab dem ersten FULL-Backup nach der Umstellung
-- beginnt die vollständige LOG-Kette.
BACKUP DATABASE [AppDB]
TO DISK = N'D:\Backup\AppDB_FULL.bak'
WITH COMPRESSION, STATS = 10;
Backup-Typen im Detail
FULL Backup – Die Basis
Ein FULL Backup enthält alle Datenbankseiten zum Zeitpunkt des Backups sowie alle während des Backup-Vorgangs angefallenen Transaktionen. Es ist self-contained – ein Restore ist ohne weitere Dateien möglich.
✔ Eigenschaften FULL
- Vollständige Datenbasis – steht allein
- Startpunkt jeder Restore-Kette
- Copy-Only-FULL bricht die LOG-Kette nicht
- Basis für DIFFERENTIAL-Backups
- Kann auf Sekundär-Replikat (AG) laufen
✗ Nachteile FULL
- Größtes Backup – höchster I/O, längste Laufzeit
- Bei großen DBs: stundenlange Backup-Fenster
- Hoher Speicherbedarf ohne Kompression
- Allein kein Point-in-Time möglich
DIFFERENTIAL Backup – Der intelligente Mittelweg
Ein DIFFERENTIAL Backup sichert alle seit dem letzten FULL geänderten Datenbank-Extents (8 Seiten). Es ist kumulativ – jedes neue DIFF enthält alle Änderungen seit dem letzten FULL, nicht nur seit dem letzten DIFF. Das vereinfacht den Restore erheblich.
| Vergleich | FULL | DIFFERENTIAL | LOG-Kette |
|---|---|---|---|
| Restore-Dateien | 1 (FULL) | 2 (FULL + letztes DIFF) | FULL + letztes DIFF + alle LOGs seit DIFF |
| Backup-Größe | Sehr groß (100 %) | Mittel (typ. 10–40 %) | Klein (typ. 1–5 %) |
| Backup-Dauer | Lang | Mittel | Sehr kurz |
| Point-in-Time | Nein | Nein | Ja (auf Sekunde) |
| Kürzt Transaktionslog | Nein | Nein | Ja |
| SIMPLE-Modell möglich | Ja | Ja | Nein |
LOG Backup – Point-in-Time und Log-Kürzung
Das Transaction Log Backup sichert alle seit dem letzten LOG-Backup angefallenen Log-Einträge. Es ist das Herzstück jeder professionellen Backup-Strategie: Es ermöglicht die Wiederherstellung auf jeden beliebigen Zeitpunkt und ist die einzige Methode, das Transaktionslog zu kürzen.
-- FULL Backup mit Kompression und Prüfsumme
BACKUP DATABASE [AppDB]
TO DISK = N'\\backup-srv\SQL\AppDB\FULL\AppDB_20250425.bak'
WITH
COMPRESSION,
CHECKSUM,
STATS = 5,
NAME = N'AppDB – FULL – 2025-04-25';
-- DIFFERENTIAL Backup
BACKUP DATABASE [AppDB]
TO DISK = N'\\backup-srv\SQL\AppDB\DIFF\AppDB_diff_20250425_1200.bak'
WITH DIFFERENTIAL, COMPRESSION, CHECKSUM, STATS = 5;
-- LOG Backup (kürzt auch das Transaktionslog)
BACKUP LOG [AppDB]
TO DISK = N'\\backup-srv\SQL\AppDB\LOG\AppDB_log_20250425_1215.trn'
WITH COMPRESSION, CHECKSUM, STATS = 10;
-- COPY_ONLY FULL – bricht LOG-Kette NICHT
-- Ideal fuer Ad-hoc-Backups, Tests, Migrationen
BACKUP DATABASE [AppDB]
TO DISK = N'D:\Temp\AppDB_copy_only.bak'
WITH COPY_ONLY, COMPRESSION, CHECKSUM;
RPO & RTO – Die entscheidenden Kennzahlen
Bevor eine Backup-Strategie festgelegt wird, müssen zwei Fragen mit dem Business beantwortet werden. Die Antworten definieren direkt, welche Backup-Typen und -Frequenzen nötig sind.
⏱ RPO – Recovery Point Objective
- Frage: Wie viele Daten dürfen maximal verloren gehen?
- Einheit: Zeit (Sekunden, Minuten, Stunden)
- Beispiel RPO = 5 min: LOG-Backups alle 5 Minuten nötig
- Beispiel RPO = 24 h: Ein tägliches FULL-Backup reicht
- Wird bestimmt durch: Geschäftsrisiko eines Datenverlusts
⏳ RTO – Recovery Time Objective
- Frage: Wie lange darf die Wiederherstellung dauern?
- Einheit: Zeit (Minuten, Stunden)
- Beispiel RTO = 1 h: Restore + Anwendung in 60 min möglich?
- Beispiel RTO = 4 h: Mehr Spielraum, kleinere Backup-Splits
- Wird bestimmt durch: Toleranz für Systemausfall
RPO / RTO Visualisierung – Typische Backup-Kette
Restore-Pfad: FULL (So 22:00) → DIFF (Mo 06:00) → LOG (Mo 07:00) → LOG (Mo 08:00) → Point-in-Time 08:47
RPO: max. 1 Stunde (letztes LOG-Backup) |
RTO: abhängig von Restore-Dauer aller Dateien + Datenbankgröße
RPO / RTO – Strategie-Matrix nach Anforderung
| RPO-Ziel | RTO-Ziel | Empfohlene Strategie | Backup-Frequenz LOG | Technologie |
|---|---|---|---|---|
| ≈ 0 (kein Verlust) | < 30 s | AlwaysOn synchron + LOG-Backups | Jede Minute | AG + LOG |
| < 5 Minuten | < 30 min | FULL täglich + LOG alle 5 min | 5 Minuten | FULL + LOG |
| < 1 Stunde | < 2 Stunden | FULL wöchentlich + DIFF täglich + LOG stündlich | 1 Stunde | FULL + DIFF + LOG |
| < 24 Stunden | < 4 Stunden | FULL täglich + DIFF alle 4–8 h | Entfällt (SIMPLE) | FULL + DIFF |
| 24 Stunden | < 8 Stunden | FULL täglich (SIMPLE Recovery) | Nicht möglich | Nur FULL |
Backup-Strategien für die Praxis
Strategie A – Kleine bis mittlere Datenbanken (< 100 GB)
Kein DIFF nötig – der Restore eines täglichen FULL + einiger LOGs ist schnell genug.
| Backup-Typ | Frequenz | Aufbewahrung | Ziel |
|---|---|---|---|
| FULL | Täglich 22:00 | 14 Tage | Netzwerk-Share / Cloud |
| DIFFERENTIAL | — | — | Nicht erforderlich |
| LOG | Alle 15 Min. | 7 Tage | Netzwerk-Share |
Strategie B – Große Datenbanken (100 GB – 1 TB)
Der Restore nutzt FULL + letztes DIFF + wenige LOGs – deutlich schneller als reine LOG-Kette.
| Backup-Typ | Frequenz | Aufbewahrung | Ziel |
|---|---|---|---|
| FULL | Sonntag 23:00 | 4 Wochen | Netzwerk-Share + Cloud-Tier |
| DIFFERENTIAL | Mo–Sa 23:00 | 2 Wochen | Netzwerk-Share |
| LOG | Alle 30 Min. | 7 Tage | Schneller lokaler Share |
Strategie C – VLDB (Very Large Databases, > 1 TB)
-- Backup auf 4 parallele Dateien aufteilen – bis zu 4x schneller
BACKUP DATABASE [VeryLargeDB]
TO
DISK = N'\\backup01\SQL\VLDB_1.bak',
DISK = N'\\backup02\SQL\VLDB_2.bak',
DISK = N'\\backup03\SQL\VLDB_3.bak',
DISK = N'\\backup04\SQL\VLDB_4.bak'
WITH
COMPRESSION,
CHECKSUM,
MAXTRANSFERSIZE = 4194304, -- 4 MB (optimal fuer grosse DBs)
BUFFERCOUNT = 50,
STATS = 1;
Backup-Validierung – Pflicht, keine Kür
Ein Backup das nie getestet wurde, ist kein Backup. Die CHECKSUM-Option erkennt Korruption beim Schreiben – aber nur ein vollständiger Restore-Test beweist die Wiederherstellbarkeit.
-- Backup-Datei auf Integrität prüfen (ohne Restore)
RESTORE VERIFYONLY
FROM DISK = N'\\backup-srv\SQL\AppDB\FULL\AppDB_20250425.bak'
WITH CHECKSUM;
-- Backup-Header auslesen (Inhalt, Zeitstempel, LSN)
RESTORE HEADERONLY
FROM DISK = N'\\backup-srv\SQL\AppDB\FULL\AppDB_20250425.bak';
-- Dateien im Backup auflisten
RESTORE FILELISTONLY
FROM DISK = N'\\backup-srv\SQL\AppDB\FULL\AppDB_20250425.bak';
-- Point-in-Time Restore (auf Testserver!)
RESTORE DATABASE [AppDB_Test]
FROM DISK = N'\\backup-srv\SQL\AppDB\FULL\AppDB_20250425.bak'
WITH NORECOVERY, MOVE N'AppDB' TO N'D:\Data\AppDB_Test.mdf',
MOVE N'AppDB_log' TO N'E:\Log\AppDB_Test_log.ldf';
RESTORE LOG [AppDB_Test]
FROM DISK = N'\\backup-srv\SQL\AppDB\LOG\AppDB_log_20250425_1215.trn'
WITH NORECOVERY;
-- Letztes LOG: RECOVERY = Datenbank online bringen
RESTORE LOG [AppDB_Test]
FROM DISK = N'\\backup-srv\SQL\AppDB\LOG\AppDB_log_20250425_1300.trn'
WITH RECOVERY, STOPAT = N'2025-04-25T12:47:00';
AlwaysOn & Backup – Optimierung durch Replikate
Availability Groups bieten eine der wirkungsvollsten Backup-Optimierungen: Die I/O-Last des Backups kann vollständig vom Primär-Replikat auf ein Sekundär verlagert werden. Das entlastet den produktiven Primary und nutzt das passive Replikat aktiv.
Backup-Präferenz in der AG konfigurieren
🔵 Primary Replica – Empfehlungen
- Nur FULL Backups (Copy-Only für Tests)
- Kein DIFFERENTIAL – verursacht unnötig I/O
- Kein LOG-Backup – läuft besser auf Sekundär
- Ausnahme: Kein Sekundär verfügbar → Fallback
- Einstellung:
PREFER SECONDARY
🟢 Secondary Replica – Empfehlungen
- LOG-Backups (entlastet Primary I/O)
- DIFFERENTIAL Backups
- COPY_ONLY FULL für Dev/Test
- DBCC CHECKDB ausführen (I/O auf Sekundär)
- Setzt FULL Recovery-Modell voraus
| AG Backup-Präferenz | Verhalten | Empfehlung |
|---|---|---|
PRIMARY |
Backups laufen ausschließlich auf dem Primary | Nicht empfohlen – Primary belastet |
SECONDARY_ONLY |
Backups nur auf Sekundär; bei Ausfall kein Backup | Riskant – kein Fallback |
PREFER SECONDARY |
Sekundär bevorzugt; Fallback auf Primary wenn nötig | Empfohlen – Best Practice |
NONE |
Kein Einfluss auf Backup-Entscheidung | Manuell – eigene Logik nötig |
Wichtige Einschränkungen bei AG-Backups
✔ Auf Sekundär möglich
- LOG Backups (vollständig kompatibel)
- COPY_ONLY FULL Backups
- DIFFERENTIAL Backups (seit SQL 2016 SP1)
- DBCC CHECKDB für Integritätsprüfung
- Statistik-Updates (lesend)
✗ Nur auf Primary möglich
- Reguläre FULL Backups (nicht COPY_ONLY)
- BACKUP LOG mit TRUNCATE_ONLY
- Filegroup-Backups bestimmter Typen
- Teilsicherungen (Partial Backups)
- System-Datenbanken (master, msdb)
-- AG Backup-Präferenz setzen
ALTER AVAILABILITY GROUP [AG_PROD]
SET (AUTOMATED_BACKUP_PREFERENCE = PREFER_SECONDARY);
-- Prüfen ob aktueller Knoten das bevorzugte Backup-Replikat ist
-- (in Backup-Jobs verwenden – verhindert doppelte Backups)
IF (sys.fn_hadr_backup_is_preferred_replica(N'AppDB') = 1)
BEGIN
BACKUP LOG [AppDB]
TO DISK = N'\\backup-srv\SQL\AppDB\LOG\AppDB_log.trn'
WITH COMPRESSION, CHECKSUM;
PRINT N'LOG-Backup auf bevorzugtem Replikat durchgefuehrt.';
END
ELSE
PRINT N'Dieses Replikat ist nicht bevorzugt – kein Backup.';
-- Replikat-Backup-Status prüfen (dbaTools)
Get-DbaAgReplica -SqlInstance "SQL-NODE1" -AvailabilityGroup "AG_PROD" |
Select-Object Name, Role, BackupPriority, AutomatedBackupPreference
Tail-Log Backup – Der letzte Rettungsanker
Bei einem Ausfall des Primary-Replikats und noch erreichbarem Datenbankfile kann ein Tail-Log Backup die zuletzt verbuchten Transaktionen sichern, bevor der Failover vollzogen wird. Dieses Backup enthält alles seit dem letzten regulären LOG-Backup.
-- Tail-Log sichern wenn Datenbank noch erreichbar aber beschaedigt
-- NO_TRUNCATE: sichert auch wenn Daten-Dateien beschaedigt sind
BACKUP LOG [AppDB]
TO DISK = N'\\backup-srv\SQL\AppDB\LOG\AppDB_TAILLOG_emergency.trn'
WITH
NO_TRUNCATE, -- Auch bei beschaedigten Datendateien
NORECOVERY, -- Datenbank geht in Restoring-Status
CHECKSUM;
-- Danach: Restore-Kette auf Standby/DR-Server abschliessen
Automatisierung mit dbaTools
dbaTools bietet mit Backup-DbaDatabase und dem Ola-Hallengren-kompatiblen
Invoke-DbaDbLogShipping eine vollständige Backup-Automatisierung. Besonders
hilfreich ist die integrierte AG-Awareness: Backups werden automatisch auf dem bevorzugten
Replikat ausgeführt.
# FULL Backup aller Benutzerdatenbanken mit Kompression
Backup-DbaDatabase -SqlInstance "SQL-NODE1" `
-Type Full `
-Path "\\backup-srv\SQL" `
-CompressBackup `
-Checksum `
-Verify `
-ExcludeDatabase "tempdb"
# LOG-Backup mit AG-Awareness (bevorzugtes Replikat)
Backup-DbaDatabase -SqlInstance "SQL-NODE1", "SQL-NODE2" `
-Type Log `
-Path "\\backup-srv\SQL\LOG" `
-CompressBackup `
-Checksum `
-AzureBaseUrl "" # optional: direkt nach Azure
# Backup-History der letzten 7 Tage anzeigen
Get-DbaDbBackupHistory -SqlInstance "SQL-NODE1" `
-Since (Get-Date).AddDays(-7) |
Select-Object Database, Type, Start, End, TotalSize, CompressedBackupSize |
Sort-Object Start -Descending
# Letzte Backup-Zeit pro Datenbank – sofort sehen welche fehlen
Get-DbaLastBackup -SqlInstance "SQL-NODE1" |
Select-Object Name, RecoveryModel,
LastFullBackup, LastDiffBackup, LastLogBackup |
Where-Object { $_.LastFullBackup -lt (Get-Date).AddDays(-1) }
# Backup-Datei verifizieren (ohne Restore)
Test-DbaLastBackup -SqlInstance "SQL-NODE1" `
-Database "AppDB" `
-Destination "SQL-TEST01" # Restore auf Testserver!
# Ola Hallengren Maintenance Solution installieren
Install-DbaMaintenanceSolution -SqlInstance "SQL-NODE1" `
-Database "DBAMaintenance" `
-BackupLocation "\\backup-srv\SQL" `
-InstallJobs `
-LogToTable
Backup-Monitoring – Was überwacht werden muss
| Überwachungspunkt | Schwellwert (Beispiel) | Konsequenz bei Überschreitung | dbaTools-Befehl |
|---|---|---|---|
| Letztes FULL-Backup | > 25 Stunden | Alert, Backup sofort starten | Get-DbaLastBackup |
| Letztes LOG-Backup | > RPO × 1,5 | Alert, Job-Ausfall prüfen | Get-DbaLastBackup |
| LOG-Datei Wachstum | > 80 % des Log-Volumes | Sofortige Analyse – LOG-Backup fehlt? | Get-DbaDbLogSpace |
| Backup-Dauer | +50 % gegenüber Baseline | I/O-Engpass, Fragmentierung prüfen | Get-DbaDbBackupHistory |
| Backup-Verify | Fehler bei VERIFYONLY | Sofort – Backup unbrauchbar | Test-DbaLastBackup |
| Log-Reuse-Wait | LOG_BACKUP seit > 30 min |
LOG-Job hängt oder deaktiviert | Get-DbaDbSpace |
① Recovery-Modell FULL für alle Produktionsdatenbanken | ② LOG-Backups mindestens alle 15 Minuten | ③ CHECKSUM bei jedem Backup | ④ Regelmäßige Restore-Tests auf Testsystem | ⑤ AG-Backups auf Sekundär (PREFER SECONDARY) | ⑥
sys.fn_hadr_backup_is_preferred_replica in jedem Backup-Job