Бэкапы и восстановление: pg_dump, PITR, RPO и RTO
↑ 6.1 Масштабирование и надёжность данных · ← Предыдущая · → Следующая
Зачем это на собесе
Бэкап, который не восстанавливали, — не бэкап. Спрашивают виды, PITR и целевые показатели восстановления.
RPO и RTO
- RPO (Recovery Point Objective) — допустимая потеря данных (сколько времени данных можем потерять): «не более 5 минут»;
- RTO (Recovery Time Objective) — допустимое время восстановления сервиса: «не более 1 часа».
От них зависят стратегия бэкапов, репликация и бюджет. RPO ≈ 0 требует синхронной репликации/непрерывной архивации WAL; малый RTO — горячий резерв (реплика), автоматический failover.
Виды бэкапов PostgreSQL
| Тип | Инструмент | Особенности |
|---|---|---|
| Логический | pg_dump / pg_dumpall / pg_restore | SQL или custom-формат; переносим между версиями; медленный на больших БД; снимок на момент начала |
| Физический | pg_basebackup, pgBackRest, Barman, WAL-G | копия файлов кластера; быстрое восстановление; только та же major-версия |
| Непрерывная архивация WAL | archive_command, pgBackRest, WAL-G | основа PITR |
| Снимки ФС/диска | LVM, ZFS, облачные snapshot | быстро; нужно согласование (pg_backup_start/stop, атомарные снимки) |
| Реплика | streaming replication | не бэкап (см. ниже), но можно делать бэкап с реплики |
# логический
pg_dump -Fc -j 4 -d app -f app_$(date +%F).dump # custom format, параллельно
pg_restore -d app_restore -j 4 --clean --if-exists app_2026-09-30.dump
# физический
pg_basebackup -h primary -U replicator -D /backup/base -Fp -Xs -P -c fastPITR (Point-In-Time Recovery)
Восстановление на любой момент времени: базовая копия + архив WAL → проигрываем журнал до нужной точки (например, за секунду до ошибочного DROP TABLE).
base backup (воскресенье) + WAL segments (непрерывно) ─▶ recovery_target_time = '2026-09-30 14:59:30'Настройка:
# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'pgbackrest --stanza=main archive-push %p'
# восстановление
restore_command = 'pgbackrest --stanza=main archive-get %f %p'
recovery_target_time = '2026-09-30 14:59:30'
recovery_target_action = 'promote'Восстанавливаем в отдельный экземпляр, проверяем данные, выгружаем нужное или переключаем трафик.
Возможности pgBackRest: полные, дифференциальные, инкрементальные бэкапы, параллельность, сжатие, шифрование, хранение в S3, проверка целостности, restore --type=time.
Стратегия 3-2-1
3 копии данных, на 2 разных типах носителей, 1 вне площадки (другой регион/облако). Плюс неизменяемое хранилище (Object Lock) от шифровальщиков.
Политика
| Параметр | Пример |
|---|---|
| Полный бэкап | раз в неделю |
| Инкрементальный/дифференциальный | ежедневно |
| Архив WAL | непрерывно (RPO = минуты/секунды) |
| Хранение | 7 дневных, 4 недельных, 12 месячных (по требованиям) |
| Шифрование | да, ключи отдельно |
| Мониторинг | алерты на отсутствие бэкапа, архивации WAL, рост pg_stat_archiver.failed_count |
Проверка восстановления
- регулярные тесты восстановления (автоматически: поднять, проверить размер, выполнить контрольные запросы, сравнить счётчики) — и время восстановления как факт RTO;
- документированный runbook: кто, что, в каком порядке;
- учения (DR-drills);
- проверка
pg_verifybackup, контрольных сумм,pg_checksums(страницы данных).
Особенности
- логический бэкап не содержит WAL, PITR невозможен;
- бэкап большой БД с
pg_dumpдержит снимок и долгую транзакцию (мешает VACUUM); - глобальные объекты (роли) не входят в
pg_dumpодной БД:pg_dumpall --globals-only; - восстановление с реплики возможно, но требует контроля лага;
- консистентность между БД и объектным хранилищем/очередями — отдельная задача (см. связь метаданных).
Другие системы
| БД | Бэкап |
|---|---|
| MySQL | xtrabackup, binlog для PITR |
| MongoDB | mongodump, снимки, oplog, Ops Manager / Atlas |
| ClickHouse | BACKUP ... TO S3, clickhouse-backup, FREEZE |
| Redis | RDB/AOF копии |
Вопросы с ответами
Что такое PITR и как он работает?
Восстановление на выбранный момент: из базовой копии поднимается кластер, затем проигрываются архивные WAL до целевой точки. Позволяет вернуться, например, на секунду до ошибочного удаления данных.
Чем RPO отличается от RTO?
RPO — сколько данных (по времени) допустимо потерять; RTO — за какое время нужно восстановить работу.
Почему реплика — это не бэкап?
Любое изменение, включая ошибочное удаление и повреждение, немедленно реплицируется. Бэкап даёт откат на прошлое состояние.