Блог "Дети ОИТа"
/поиск

Резервное копирование и восстановление PostgreSQL

Резервное копирование и восстановление 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)

  1. Настройка wal_level в postgresql.conf:
wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/archive/%f'
  1. Создание базовой копии:
pg_basebackup -U postgres -D /backup/base -Fp -Xs -P

Восстановление на определённый момент (PITR)

  1. Остановить PostgreSQL
  2. Скопировать базовую копию
  3. Скопировать WAL-логи
  4. Создать recovery.conf:
restore_command = 'cp /var/lib/postgresql/archive/%f %p'
recovery_target_time = '2026-10-08 15:30:00'
  1. Запустить 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