Skip to content

Как настроить бэкап PostgreSQL

Коротко:

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.

Пошаговая настройка

  1. Для daily snapshot: pg_dump -Fc -Z9 -f backup.dump dbname (compressed custom format)
  2. Для физического: pg_basebackup -D /backup/base -Ft -z -P -U replicator
  3. Настройте WAL archiving в postgresql.conf: archive_mode = on; archive_command = 'aws s3 cp %p s3://bucket/wal/%f'
  4. Автоматизация через cron: 0 3 * * * /usr/bin/pg_dump -Fc -f /backup/daily-\$(date +\%Y\%m\%d).dump dbname
  5. Upload в S3: AWS CLI или s3cmd для retention + offsite
  6. Test restore monthly: pg_restore -d new_db /backup/daily-20260401.dump
  7. Для PITR: pg_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_dumpcreatedb newdb pg_restore -d newdb -j 4 /backup/mydb-20260401.dump
pg_basebackuppg_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 для больших DB (100+ GB) — очень медленно. Используйте pg_basebackup
  • No WAL archiving = можно потерять данные между snapshot'ами
  • Backup не testing — первый raw fail в critical moment
  • Hardcoded password в script — security. Используйте .pgpass или IAM role
  • S3 без versioning — race при concurrent uploads потеряет последний

Больше по теме

Часто задаваемые вопросы

pg_dump vs pg_basebackup?

pg_dump — logical, per-database, portable (restore на другой PG version). pg_basebackup — physical, whole cluster, fast, но restore только на same PG version.

Incremental backups?

PG не имеет built-in incremental. Используйте pg_basebackup + WAL archiving (effectively incremental через WAL). Или tool pgBackRest.

Сколько retention?

Для compliance обычно 30-90 дней. For disaster recovery достаточно 7-14 days. S3 lifecycle rules помогают auto-cleanup.

Backup verification?

<code>pg_restore --list</code> показывает content. Real test: periodic full restore to staging, run smoke tests.