Резервное копирование и восстановление PostgreSQL
Логическое резервное копирование
pg_dump
# Бэкап одной БД
pg_dump -U postgres mydb > backup.sql
# Бэкап всех БД
pg_dumpall -U postgres > full_backup.sql
# Сжатый бэкап
pg_dump -U postgres mydb | gzip > backup.sql.gz
# Только структура
pg_dump -s -U postgres mydb > schema.sql
# Только данные
pg_dump -a -U postgres mydb > data.sql
pg_restore
# Восстановление из custom-формата
pg_restore -U postgres -d mydb backup.dump
# Параллельное восстановление (4 потока)
pg_restore -j 4 -U postgres -d mydb backup.dump
Физическое резервное копирование
Копирование файлов БД
# Остановить PostgreSQL
systemctl stop postgresql
# Скопировать каталог данных
cp -r /var/lib/postgresql/15/main /backup/pg_data
# Запустить
systemctl start postgresql
Непрерывный бэкап (PITR)
- Настройка wal_level в postgresql.conf:
wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/archive/%f'
- Создание базовой копии:
pg_basebackup -U postgres -D /backup/base -Fp -Xs -P
Восстановление на определённый момент (PITR)
- Остановить PostgreSQL
- Скопировать базовую копию
- Скопировать WAL-логи
- Создать recovery.conf:
restore_command = 'cp /var/lib/postgresql/archive/%f %p'
recovery_target_time = '2026-10-08 15:30:00'
- Запустить PostgreSQL
Автоматизация
Скрипт бэкапа
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
pg_dump -U postgres mydb | gzip > /backup/mydb_$DATE.sql.gz
find /backup -name "*.sql.gz" -mtime +30 -delete
cron
0 2 * * * /usr/local/bin/pg_backup.sh