Automatisierte Backups (pgBackRest/Barman/Xtrabackup/cron)
Symptom
Ziel: Datenbank-Backups automatisieren; mit geplanter Voll- + inkrementeller Sicherung + WAL-/Binlog-Archivierung, Aufbewahrung, Verifizierung und einer Offsite-Kopie eine zuverlässige Wiederherstellungskette aufbauen.
1. Das richtige Backup-Werkzeug wählen
Wähle ein Werkzeug für deine Engine: pgBackRest oder Barman für PostgreSQL (physisches Backup + WAL-Archiv + PITR); Percona XtraBackup (physisches Online-Backup) für MySQL/MariaDB oder mysqldump/mydumper (logisch) für kleine Datenmengen. Physische Werkzeuge liefern bei großen Datenbanken schnelle, konsistente Backups + Point-in-Time-Recovery; logische Dumps sind portabel, aber bei großen Datenmengen langsam.
PostgreSQL
# pgBackRest or BarmanMySQL
# physical: xtrabackup
# logical: mysqldump / mydumper2. Kette aus Voll- + inkrementellem Backup + kontinuierlichem Archiv aufbauen
Richte Point-in-Time-Recovery mit wöchentlichen/täglichen Vollbackups, inkrementellen/differenziellen Backups dazwischen und kontinuierlicher Archivierung von WAL (PostgreSQL) bzw. Binlog (MySQL) ein. pgBackRest verwaltet die Backup-Typen full/diff/incremental und das WAL-Archiv; in PostgreSQL richtest du archive_command auf pgBackRest aus. Inkrementelle Backups + Archiv ermöglichen die Rückkehr zu jedem beliebigen Zeitpunkt.
PostgreSQL
# postgresql.conf
archive_mode = on
archive_command = 'pgbackrest --stanza=appdb archive-push %p'
# full backup
pgbackrest --stanza=appdb --type=full backup
# incremental
pgbackrest --stanza=appdb --type=incr backupMySQL
# full
xtrabackup --backup --target-dir=/backup/full
# incremental
xtrabackup --backup --target-dir=/backup/incr1 \
--incremental-basedir=/backup/full3. Backups mit cron/Timer planen
Führe Backup-Befehle regelmäßig mit cron oder einem systemd-Timer aus: zum Beispiel ein Vollbackup in der Nacht auf Sonntag und inkrementelle an den übrigen Nächten. Plane außerhalb der Geschäftszeiten und stelle sicher, dass sich full- und incr-Jobs nicht überschneiden. Schreibe die Ausgabe in Logs und löse bei Fehlern einen Alarm aus.
PostgreSQL
# crontab
0 1 * * 0 pgbackrest --stanza=appdb --type=full backup
0 1 * * 1-6 pgbackrest --stanza=appdb --type=incr backup4. Aufbewahrungsrichtlinie festlegen
Sammle Backups nicht endlos an; lege fest, wie viele Vollbackups und wie viele Tage Archiv aufbewahrt werden, und lass das Werkzeug alte automatisch verfallen. In pgBackRest wird das mit repo1-retention-full und den Einstellungen zur Archivaufbewahrung gesteuert, in Barman mit retention_policy. Die Aufbewahrung muss zu deinen Wiederherstellungszielen passen (wie viele Tage du zurückgehen musst).
PostgreSQL
# pgbackrest.conf
[global]
repo1-retention-full=4
repo1-retention-archive=8MySQL
# purge old backups with cron (example)
find /backup -type d -mtime +14 -exec rm -rf {} +5. Backups offsite / nach S3 kopieren
Backups dürfen nicht auf derselben Maschine bzw. in derselben Region wie die Datenbank bleiben; kopiere sie an einen anderen Ort oder in Object Storage (S3, GCS). pgBackRest kann direkt in S3-kompatiblen Storage schreiben; andernfalls synchronisiere mit rsync/rclone zu einem Offsite-Ziel. Im Katastrophenfall (Verlust der lokalen Platte/Region) rettet dich nur die Offsite-Kopie.
PostgreSQL
# pgbackrest.conf S3 repository
[global]
repo1-type=s3
repo1-s3-bucket=company-backup
repo1-s3-region=eu-central-1
repo1-s3-endpoint=s3.eu-central-1.amazonaws.com6. Backup verifizieren
Dass ein Backup existiert, heißt nicht, dass es sich wiederherstellen lässt; prüfe die Integrität regelmäßig. In pgBackRest zeigen der Befehl 'verify' und die Konsistenzprüfungen des Archivs, in XtraBackup ein erfolgreicher prepare-Schritt (--prepare), dass das Backup intakt ist. Führe die Verifizierung nach jedem Backup automatisch aus und löse bei Fehlern einen Alarm aus.
PostgreSQL
pgbackrest --stanza=appdb verifyMySQL
# make the backup consistent (verification)
xtrabackup --prepare --target-dir=/backup/full7. Regelmäßige Wiederherstellungsübungen durchführen
Der wichtigste Schritt: Stelle das Backup regelmäßig TATSÄCHLICH auf einem separaten Server wieder her und prüfe, dass die Datenbank öffnet und die Daten konsistent sind. Mit dieser Übung misst du deine Wiederherstellungszeit (RTO) und findest Lücken im Verfahren außerhalb eines Incidents. Ein ungetestetes Backup ist kein Backup.
PostgreSQL
# restore + PITR on a separate server
pgbackrest --stanza=appdb \
--type=time --target="2026-07-01 03:00:00" restoreMySQL
# copy the prepared backup back to the data directory
xtrabackup --copy-back --target-dir=/backup/full