Záloha PostgreSQL přes pg_dump

Cíl: pravidelný, konzistentní dump databáze PostgreSQL běžící v Dockeru, který přežije i zálohu celého serveru za běhu a jde obnovit i do novější verze PostgreSQL.
Předpoklady: přístup do shellu hostitele (SSH), práva spouštět docker, adresář, který se dál zálohuje (USB disk, NAS, záloha Umbrelu).

Proč dump, a ne jen záloha souborů

Postup

  1. Zjisti název kontejneru, uživatele a databázi:
    docker ps --format '{{.Names}}' | grep -i postgres
    docker exec <kontejner> psql -U <uživatel> -l
    
  2. Ruční dump v custom formátu (komprimovaný, obnova přes pg_restore). dok. PostgreSQL pg_dump se spouští uvnitř kontejneru, takže verze klienta odpovídá serveru (Syntéza).
    docker exec <kontejner> pg_dump -U <uživatel> -Fc <databáze> > /cesta/k/zaloham/<databáze>-$(date +%F).dump
    
  3. Volitelně role a další globální nastavení. pg_dump je nezálohuje. dok. PostgreSQL
    docker exec <kontejner> pg_dumpall -U <uživatel> --globals-only > /cesta/k/zaloham/globals-$(date +%F).sql
    
  4. Skript pro pravidelné spouštění s mazáním starých dumpů (Syntéza), např. pg-backup.sh:
    #!/bin/sh
    set -e
    CONTAINER=<kontejner>
    DB=<databáze>
    DBUSER=<uživatel>
    DIR=/cesta/k/zaloham
    KEEP_DAYS=14
    
    TMP="$DIR/$DB-$(date +%F_%H%M).dump.part"
    docker exec "$CONTAINER" pg_dump -U "$DBUSER" -Fc "$DB" > "$TMP"
    mv "$TMP" "${TMP%.part}"
    find "$DIR" -name "$DB-*.dump" -mtime +"$KEEP_DAYS" -delete
    
    Soubor .part se přejmenuje až po úspěšném dumpu, takže nedokončený dump nevypadá jako platná záloha.
  5. Naplánuj ho přes cron, např. denně ve 3:00, před zálohou celého serveru:
    0 3 * * * /cesta/k/pg-backup.sh >> /cesta/k/zaloham/pg-backup.log 2>&1
    

Ověření

Obnova

Troubleshooting

Souvislosti

Zdroje