Проблема: Отсутствие автоматического резервного копирования БД PostgreSQL. Восстановление данных при сбое требует ручного вмешательства, возрастает риск необратимой потери.

Причины:
1. PostgreSQL не имеет встроенного планировщика — нужна внешняя утилита (cron/systemd).
2. Ручное выполнение `pg_dump` / `pg_basebackup` не гарантирует регулярность.
3. Отсутствие скрипта ротации (удаления старых копий) ведёт к переполнению диска.

Решение:
Использовать `cron` + `pg_dump` (логическое копирование) или `pg_basebackup` (физическое). Для безопасности — подключение через `.pgpass` или переменные окружения.

1. Логическое резервирование (pg_dump)

Подходит для небольших баз (до 100 ГБ). Создаёт SQL-дампа (сжимается через gzip).

Пример скрипта `/usr/local/bin/backup_pg.sh`:
bash
#!/bin/bash
BACKUP_DIR="/var/backups/postgres"
DB_NAME="mydb"
PG_USER="backup_user"
PG_HOST="localhost"
RETENTION_DAYS=7

export PGPASSWORD="$PG_PASSWORD" # или используйте ~/.pgpass
mkdir -p "$BACKUP_DIR"
pg_dump -h "$PG_HOST" -U "$PG_USER" -d "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql.gz"
find "$BACKUP_DIR" -type f -name ".sql.gz" -mtime +$RETENTION_DAYS -delete


Настройка cron:
bash
crontab -e
<h2 id="ezhednevno-v-2-00">ежедневно в 2:00</h2>
0 2 /usr/local/bin/backup_pg.sh >/dev/null 2>&1


2. Физическое резервирование (pg_basebackup)

Подходит для больших БД и PITR (point-in-time recovery). Требует включённой архивации WAL.

Скрипт `/usr/local/bin/basebackup_pg.sh`:
bash
#!/bin/bash
BACKUP_DIR="/var/backups/pg_basebackup"
PG_USER="replicator" # пользователь с правами REPLICATION
PG_HOST="localhost"
RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"
pg_basebackup -h "$PG_HOST" -U "$PG_USER" -D "$BACKUP_DIR/$(date +%Y%m%d_%H%M%S)" -Ft -z -P
find "$BACKUP_DIR" -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;


Настройка прав для репликации (pg_hba.conf):
local
replication     replicator                                md5
host replication replicator 127.0.0.1/32 md5


Тестирование:
bash
pg_basebackup -h localhost -U replicator -D /tmp/test_backup -Ft -z


3. Учёт безопасности

- Используйте отдельного пользователя БД с минимальными правами: для `pg_dump` — `SELECT` на все таблицы; для `pg_basebackup` — `REPLICATION`.
- Пароль храните в `~/.pgpass` (права 600) или в переменной `PGPASSWORD` (менее безопасно).
- Копии храните на отдельном носителе (например, смонтированный NFS/сетевой диск).