In der Welt der Datenbankadministration ist ein zuverlässiges Backup- und Wiederherstellungsverfahren das Fundament jeder erfolgreichen Strategie zur Datenintegrität und -sicherheit. In diesem Beitrag zeige ich dir, wie SQL-Datenbanken effizient gesichert und im Notfall wiederhergestellt werden können – egal ob du mit Microsoft SQL Server, PostgreSQL, MySQL oder einem anderen System arbeitest.
Warum sind Backups so wichtig?
Datenverluste können durch viele Faktoren verursacht werden: Hardwareausfall, Benutzerfehler, Software-Bugs, Ransomware oder Naturkatastrophen. Ein regelmäßiges Backup stellt sicher, dass du deine Daten mit minimalem Datenverlust und Ausfallzeit wiederherstellen kannst.
Arten von SQL-Backups
1. Voll-Backup
Speichert die gesamte Datenbank zu einem bestimmten Zeitpunkt. Ideal für eine vollständige Wiederherstellung.
— Beispiel für SQL Server
BACKUP DATABASE [MeineDatenbank] TO DISK = 'C:\Backup\MeineDatenbank.bak'
2. Differenzielles Backup
Speichert nur die Änderungen seit dem letzten vollständigen Backup. Spart Speicherplatz und Zeit.
— SQL Server Beispiel
BACKUP DATABASE [MeineDatenbank] TO DISK = 'C:\Backup\MeineDatenbank_diff.bak' WITH DIFFERENTIAL
3. Transaktionsprotokoll-Backup
Erfasst alle Transaktionen seit dem letzten Log-Backup. Wichtig für Point-in-Time-Wiederherstellungen.
BACKUP LOG [MeineDatenbank] TO DISK = 'C:\Backup\MeineDatenbank_log.trn'
Datenbank wiederherstellen
Voll-Backup wiederherstellen
RESTORE DATABASE [MeineDatenbank] FROM DISK = 'C:\Backup\MeineDatenbank.bak' WITH REPLACE
Mit Differential-Backup
-- Erst Vollbackup RESTORE DATABASE [MeineDatenbank] FROM DISK = 'C:\Backup\MeineDatenbank.bak' WITH NORECOVERY; -- Dann Differenzielles Backup RESTORE DATABASE [MeineDatenbank] FROM DISK = 'C:\Backup\MeineDatenbank_diff.bak' WITH RECOVERY;
Best Practices für Backup & Restore
- Automatisiere Backups mit SQL Agent Jobs oder CRON (Linux).
- Teste regelmäßig deine Restore-Prozesse.
- Verschlüssele und versioniere deine Backup-Dateien.
- Bewahre Backups an mehreren Orten auf (lokal + Cloud).
- Implementiere Monitoring für Backup-Fehler.
Fazit
Ein funktionierendes Backup ist wie eine Versicherung – man hofft, sie nie zu brauchen, aber wenn der Ernstfall eintritt, ist sie Gold wert. Mit einem durchdachten Backup-Plan kannst du beruhigt schlafen, denn deine Daten sind sicher.
Automatisiertes Backup bei laufender Datenbank: Überblick nach System
SQL Server
- Nutze SQL Server Agent Jobs, um zeitgesteuerte Backups (voll, diff, log) zu erstellen.
- Unterstützt Online-Backups – keine Downtime erforderlich.
- Beispiel für einen SQL Job-Plan:
- Täglich: Vollbackup
- Alle 4 Stunden: Differenzielles Backup
- Alle 15 Minuten: Transaktionslog-Backup
PostgreSQL
- Nutze
pg_dump
(für logische Backups) oderpg_basebackup
(für physische Backups). - Mit Tools wie cron + Shell Scripts lassen sich zeitgesteuerte Aufgaben einfach einrichten.
- Für Online-Backups: Stelle sicher, dass die WAL-Archive aktiviert sind.
MySQL/MariaDB
- Nutze
mysqldump
für kleinere Datenbanken oder Percona XtraBackup für große/produktive Systeme. - Percona XtraBackup bietet echte hot backup-Funktionalität – keine Downtime.
Wie automatisieren?
Beispiel: SQL Server Agent Job
USE msdb; GO EXEC sp_add_job @job_name = 'Tägliches Vollbackup'; EXEC sp_add_jobstep @job_name = 'Tägliches Vollbackup', @step_name = 'Vollbackup-Schritt', @subsystem = 'TSQL', @command = 'BACKUP DATABASE [MeineDatenbank] TO DISK = ''C:\Backup\MeineDatenbank.bak'' WITH INIT', @retry_attempts = 3, @retry_interval = 5; EXEC sp_add_schedule @schedule_name = 'Täglich um Mitternacht', @freq_type = 4, @freq_interval = 1, @active_start_time = 000000; EXEC sp_attach_schedule @job_name = 'Tägliches Vollbackup', @schedule_name = 'Täglich um Mitternacht';
Beispiel: PostgreSQL Cron Job (Linux)
0 2 * * * /usr/bin/pg_dump -U postgres meine_datenbank > /backups/meine_datenbank_$(date +\%F).sql
1. Backup mit mysqldump
(logisch, gut für kleinere DBs)
Einfach zu benutzen
Gut für kleinere Datenbanken oder Dev-Umgebungen
mysqldump -u root -p --single-transaction --quick --lock-tables=false meine_datenbank > /backups/meine_datenbank_$(date +\%F).sql
--single-transaction
ermöglicht ein konsistentes Backup ohne Tabellen zu sperren → ideal für laufende Datenbank.
Automatisierung via Cron (Linux)
0 2 * * * /usr/bin/mysqldump -u root -pmypass --single-transaction --quick --lock-tables=false meine_datenbank > /backups/db_backup_$(date +\%F).sql