Бэкапы PostgreSQL и восстановление
Раздел 8.11, шаг 10 из 12. Дальше — профилирование.
Стратегия 3-2-1
- 3 копии данных;
- 2 разных носителя/среды;
- 1 offsite (другой ДЦ/регион).
Бэкап в том же S3-bucket без versioning и без другого региона не offsite. Урок инцидентов — когда snapshot и primary сгорели в одном здании (раздел 8 — о инфраструктуре).
Логический бэкап — pg_dump
pg_dump -U app -Fc -f app_$(date +%F).dump appdb
pg_restore -U app -d appdb_restored -j 4 app_2025-05-31.dump
| Формат | Плюсы |
|---|---|
Custom -Fc | Параллельный restore, сжатие |
Directory -Fd | Параллельный dump/restore |
| Plain SQL | Читаемость, медленнее |
Подходит для миграций, отдельных схем, downgrade/upgrade с тестом. На multi-TB — долго; для больших объёмов — physical + WAL.
Базовый уровень — 3.07/106.
Физический бэкап и PITR
Physical backup — копия каталога данных + непрерывный архив WAL.
archive_mode = on
archive_command = 'test ! -f /wal_archive/%f && cp %p /wal_archive/%f'
# production — wal-g wal-push или pgBackRest
Point-in-Time Recovery (PITR) — восстановление на момент до ошибочного DROP TABLE:
- restore base backup;
- создать
recovery.signal(PG 12+); - указать
recovery_target_timeвpostgresql.conf; - Postgres проигрывает WAL до target и останавливается.
restore_command = 'cp /wal_archive/%f %p'
recovery_target_time = '2025-05-30 14:32:00+03'
recovery_target_action = 'promote'
pg_probackup
pg_probackup (Postgres Professional) — physical backup с incremental, catalog, validate.
pg_probackup init -B /backups
pg_probackup add-instance -B /backups --instance=main -D /var/lib/postgresql/data
pg_probackup backup -B /backups --instance=main -b FULL
pg_probackup backup -B /backups --instance=main -b DELTA
pg_probackup restore -B /backups --instance=main -D /pgdata_restored
Плюсы — знакомый стек в РФ, интеграция с Postgres Pro. Минусы — отдельный инструмент, обучение команды.
Wal-G
Wal-G — open-source, cloud-native backup в S3, GCS, Azure Blob.
export WALG_S3_PREFIX=s3://mybucket/pg-backups
export AWS_REGION=eu-central-1
wal-g backup-push /var/lib/postgresql/data
wal-g backup-list
wal-g backup-fetch /var/lib/postgresql/data LATEST
Continuous archiving:
archive_command = 'wal-g wal-push %p'
Restore в новый инстанс + recovery_target_timeline — типовой DR runbook в Kubernetes (CloudNativePG + Barman/Wal-G).
| pg_probackup | Wal-G | |
|---|---|---|
| Хранилище | FS, локально | Object storage |
| Incremental | Да | Да (delta) |
| Экосистема K8s | Средняя | Сильная |
Тестирование восстановления
Бэкап без проверенного restore — надежда, не стратегия.
| Частота | Действие |
|---|---|
| Еженедельно | Restore на staging, pg_checksum verify |
| Ежеквартально | PITR drill на случайное время |
| После major upgrade | Full restore test |
Checklist restore:
- RTO/RPO — сколько downtime и сколько WAL допустимо потерять?
- Документированные команды и роли.
- Отдельная сеть/secrets для restore env.
Бэкап в Kubernetes
- Volume snapshot (CSI) — быстро, но crash-consistent без freeze; лучше с
preStophook или operator backup. - Operator backup — logical/physical через sidecar, upload S3.
- Не полагайтесь только на
kubectl cprunning pod.
После failover
Новый primary продолжает WAL chain. Старые base backup привязаны к timeline — после promote проверьте pg_controldata и timeline history.
Практика
pg_dump -Fcучебной БД, restore в новую БД, сравните row counts.- Настройте Wal-G в MinIO (S3-compatible), full backup + delete random table + PITR.
- Запишите runbook restore на 1 страницу для команды.
Связанные материалы
- Восстановление данных — sysadmin
- Резервное копирование SQL
- phpPgAdmin — дампы и импорт
- Забота о данных — Git
- Справочник PostgreSQL
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). MVCC, XID, снимки данных, системные поля xmin/xmax, VACUUM и autovacuum, bloat, wraparound, процессы postmaster, Shared Buffers и WAL. pg_stat_statements, pg_stat_activity, auto_explain, pgBadger, Prometheus postgres_exporter, типовые метрики SLA и алерты. Ansible role для установки Postgres, шаблоны postgresql.conf, Terraform для RDS и managed PostgreSQL, GitOps паттерны для инфраструктуры БД. EXPLAIN и EXPLAIN ANALYZE, B-tree, GiST, SP-GiST, GIN, BRIN, частичные и составные индексы, типовые ошибки планировщика. Тонкая настройка памяти (shared_buffers, work_mem, maintenance_work_mem), I/O (effective_cache_size, random_page_cost), WAL, checkpoint и autovacuum. Документная модель в Postgres, операторы и индексы JSONB, declarative partitioning по range/list/hash, связь с оконными функциями и CTE. Хранимые функции и процедуры PL/pgSQL, row-level и statement triggers, event triggers, асинхронные события через NOTIFY и LISTEN без polling. Streaming replication, logical replication, read replicas и Hot Standby, failover, connection pooling через PgBouncer — transaction и session pooling. Официальный образ postgres, volumes для PGDATA, переменные окружения, docker-compose с healthcheck, типовые ошибки контейнеризации СУБД. Managed PostgreSQL (RDS, Cloud SQL, Yandex Managed), StatefulSet, PersistentVolume, секреты, операторы Crunchy/Zalando, anti-patterns stateful в K8s. Patroni и DCS, сравнение с Greenplum и CockroachDB, когда нужен sharding, Citus, выбор архитектуры под OLTP и аналитику. Краткое резюме раздела 8.11 — архитектура, оптимизация, эксплуатация в контейнерах и Kubernetes, HA, бэкапы и автоматизация.Архитектура PostgreSQL и внутреннее устройство
Профилирование и мониторинг PostgreSQL
Автоматизация PostgreSQL — Ansible и Terraform
Продвинутая оптимизация PostgreSQL и индексы
Конфигурация PostgreSQL — postgresql.conf
JSONB, партиционирование и расширения SQL в PostgreSQL
PL/pgSQL, триггеры и NOTIFY/LISTEN в PostgreSQL
Репликация PostgreSQL, Hot Standby и PgBouncer
PostgreSQL в Docker
PostgreSQL в облаке и Kubernetes
HA-кластеры PostgreSQL и распределённые СУБД
Практикум PostgreSQL — итоги