Skript und Anleitung zum Sichern einer PostgreSQL-Datenbank in Docker
本 nutzt das native `pg_dump`-Tool von PostgreSQL für logische Sicherungen, kombiniert mit Host-Skripten und Zeitplanaufgaben, um regelmäßige Snapshots der Daten und eine sichere Wiederherstellung zu ermöglichen.
Wird gerendert...
Dieses Schema nutzt das native PostgreSQL `pg_dump`-Tool für logische Backups, kombiniert mit Host-Skripten und geplanten Tasks, um regelmäßige Snapshots der Daten und eine sichere Wiederherstellung zu ermöglichen.
> Der Artikel basiert auf einer Linux-Umgebung. Für andere Umgebungen wie Windows nehmen Sie bitte entsprechende Anpassungen vor.
## 1. Skriptvorbereitung
```bash
#!/bin/bash
# --- Konfiguration ---
CONTAINER_NAME="pgsql" # Ihr Container-Name
DB_USER="postgres" # Datenbank-Benutzername
DB_NAME="loden" # Datenbankname (verwenden Sie "all" für alle Datenbanken)
BACKUP_DIR="/root/pgsql/backup" # Backup-Pfad auf dem Host
DATE=$(date +%Y%m%d_%H%M%S) # Datumsformat für Dateinamen
RETENTION_DAYS=10 # Aufbewahrungsdauer in Tagen
# --- Stellen Sie sicher, dass das Verzeichnis existiert ---
mkdir -p $BACKUP_DIR
# --- Führen Sie das Backup aus ---
# Prinzip: Führen Sie pg_dump im Container aus und leiten Sie die Standardausgabe (stdout) in eine Host-Datei um
echo "Backup von Container [$CONTAINER_NAME] wird durchgeführt..."
if [ "$DB_NAME" == "all" ]; then
# Backup aller Datenbanken
docker exec $CONTAINER_NAME pg_dumpall -c -U $DB_USER > "$BACKUP_DIR/full_backup_$DATE.sql"
else
# Backup einer einzelnen Datenbank (empfohlen: benutzerdefiniertes Format -Fc, komprimiert und schnelle Wiederherstellung)
docker exec $CONTAINER_NAME pg_dump -U $DB_USER -F c $DB_NAME > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"
fi
# Überprüfen Sie, ob die Backup-Datei erstellt wurde (und nicht die Größe 0 hat)
if [ -s "$BACKUP_DIR/${DB_NAME}_${DATE}.dump" ] || [ -s "$BACKUP_DIR/full_backup_$DATE.sql" ]; then
echo "Backup erfolgreich!"
else
echo "Backup fehlgeschlagen, bitte überprüfen Sie den Containerstatus oder die Logs."
# Optional: Senden Sie eine Alarm-E-Mail bei Fehlschlag
exit 1
fi
# --- Alte Backups bereinigen ---
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.dump" -delete
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.sql" -delete
```
## 2. Umgebungskonfiguration
Stellen Sie vor dem Ausführen des Skripts sicher, dass Ihre Host-Umgebung bereit ist:
1. **Backup-Verzeichnis erstellen**: Es wird empfohlen, Backup-Dateien außerhalb von Docker-Mountpunkten zu speichern:
```Bash
mkdir -p /root/pgsql/backup
```
2. **Skriptausführungsberechtigung erteilen**:
```Bash
chmod +x /root/pgsql/pg_backup.sh
```
3. **Passwortfreie Umgebung konfigurieren (entscheidend)**: Um zu vermeiden, dass das Skript nach einem Passwort fragt, wenn es unbeaufsichtigt läuft, gibt es zwei native Methoden:
- **Methode A (empfohlen)**: Fügen Sie in der `docker-compose.yml` unter `environment` `PGPASSWORD: Ihr_Passwort` hinzu.
- **Methode B**: Fügen Sie der Backup-Zeile im Skript eine Umgebungsvariable hinzu, z.B.: `docker exec -e PGPASSWORD=... $CONTAINER_NAME pg_dump ...`.
## 3. Automatisches Backup aktivieren
Nutzen Sie den integrierten Linux `crontab`-Planer, um das Backup-Skript automatisch während Zeiten mit geringer Auslastung (z.B. nachts) auszuführen. Zum Beispiel:
1. Öffnen Sie den Editor mit dem Befehl: `crontab -e`
2. Fügen Sie eine Zeile hinzu (führt das Backup täglich um 3:00 Uhr morgens aus):
```Bash
0 3 * * * /bin/bash /root/pgsql/pg_backup.sh >> /root/pgsql/backup.log 2>&1
```
*Hinweis: Der Teil `>> ...log` speichert die Backup-Protokolle, damit Sie überprüfen können, ob das Backup erfolgreich war.*
## 4. Datenwiederherstellung
Führen Sie bei versehentlichem Datenverlust (z.B. durch `TRUNCATE` oder `DROP`) die folgenden Schritte zur Wiederherstellung aus.
Überprüfen Sie vor der Wiederherstellung das Format der Backup-Datei. Wenn Ihr Skript eine bestimmte Datenbank sichert (`-F c`), hat die Datei normalerweise die Endung `.dump`. Solche Dateien müssen mit dem `pg_restore`-Tool wiederhergestellt werden.
Wiederherstellungsbefehl: Stellen Sie das Backup direkt von dem Host in der angegebenen Datenbank wieder her
```Bash
docker exec -i pgsql pg_restore -U postgres -d loden_new --clean --if-exists < /root/pgsql/backup/loden_20260106_164814.dump
```
Erläuterung gängiger Wiederherstellungsparameter:
- `-d <db_name>`: Gibt die Zieldatenbank an (es wird empfohlen, zunächst eine Testdatenbank für eine Wiederherstellungsübung zu erstellen, wie `loden_new` im Befehl).
- `--clean`: Bereinigt vorhandene Datenobjekte vor der Wiederherstellung (riskant, aber effektiv).
- `-j <n>`: Führt Wiederherstellungsaufgaben parallel aus. Bei sehr großen Datenbanken kann `-j 4` zur Beschleunigung verwendet werden.Kommentar
Melde dich an, um Kommentare anzuzeigen und zu veröffentlichen
Zur Anmeldung