Как делал бэкап PostgreSQL?

«Как делал бэкап PostgreSQL?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практике я настраиваю не разовые бэкапы, а отказоустойчивый автоматизированный пайплайн. Для этого комбинирую логические и физические бэкапы.

1. Логические бэкапы с pg_dump для гибкости: Использую для средних БД и возможности быстрого восстановления отдельных таблиц. Автоматизирую через cron или систему оркестрации (например, Jenkins).

# Ежедневный бэкап с сжатием и меткой времени
pg_dump -U postgres -d app_db -Fc | gzip > /backup/psql/app_db_$(date +%Y%m%d).dump.gz
# Проверка целостности архива
pg_restore -l /backup/psql/app_db_$(date +%Y%m%d).dump.gz > /dev/null && echo "Backup OK"

2. Непрерывное архивирование WAL (Write-Ahead Logging) для Point-in-Time Recovery (PITR): Это критично для production. Настраиваю в postgresql.conf:

wal_level = replica
archive_mode = on
archive_command = 'gzip < %p > /backup/wal_archive/%f.gz'

В сочетании с периодическим pg_basebackup это позволяет восстановить БД на любой момент времени.

3. Интеграция с облачным хранилищем и мониторинг: Скрипт загружает свежий бэкап в S3 (или другой объектный сторадж) с lifecycle-политиками, а также отправляет уведомление в Slack/Telegram в случае сбоя. Восстановление отрабатывается как часть runbook'а для аварийных ситуаций (Disaster Recovery).