PostgreSQL бэкап — 3 уровня: логический (pg_dump, portable), физический (pg_basebackup, fast restore), continuous WAL archiving (point-in-time recovery). Для прод: daily pg_basebackup + WAL archiving в S3 + retention 30 дней. Тестируйте restore ежемесячно — untested backup = no backup.
Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.
pg_dump -Fc -Z9 -f backup.dump dbname (compressed custom format)pg_basebackup -D /backup/base -Ft -z -P -U replicatorarchive_mode = on; archive_command = 'aws s3 cp %p s3://bucket/wal/%f'0 3 * * * /usr/bin/pg_dump -Fc -f /backup/daily-\$(date +\%Y\%m\%d).dump dbnamepg_restore -d new_db /backup/daily-20260401.dumppg_basebackup + apply WAL segments до target timestamp| Сценарий | Конфиг |
|---|---|
| Simple daily pg_dump script | #!/bin/bash
DATE=$(date +%Y%m%d)
pg_dump -Fc -Z9 -f /backup/mydb-$DATE.dump mydb
aws s3 cp /backup/mydb-$DATE.dump s3://mybucket/postgres/
find /backup -name 'mydb-*.dump' -mtime +7 -delete |
| postgresql.conf (archiving) | wal_level = replica
archive_mode = on
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
archive_timeout = 300 |
| Restore from pg_dump | createdb newdb
pg_restore -d newdb -j 4 /backup/mydb-20260401.dump |
| pg_basebackup | pg_basebackup -h localhost -U replicator -D /backup/base_$(date +%Y%m%d) -Ft -z -P |
| PITR restore | # restore_command in recovery.conf
restore_command = 'cp /archive/%f %p'
recovery_target_time = '2026-04-17 12:00:00' |
pg_dump — logical, per-database, portable (restore на другой PG version). pg_basebackup — physical, whole cluster, fast, но restore только на same PG version.
PG не имеет built-in incremental. Используйте pg_basebackup + WAL archiving (effectively incremental через WAL). Или tool pgBackRest.
Для compliance обычно 30-90 дней. For disaster recovery достаточно 7-14 days. S3 lifecycle rules помогают auto-cleanup.
<code>pg_restore --list</code> показывает content. Real test: periodic full restore to staging, run smoke tests.