#!/bin/bash set -e # Завершить при любой ошибке # === Настройки === BACKUP_DIR="/root/backups/postgresql" DATE=$(date +%Y%m%d-%H%M) LOG_FILE="$BACKUP_DIR/backup.log" # Параметры подключения к PostgreSQL PG_HOST="localhost" # или IP, например "127.0.0.1" PG_PORT="5432" PG_USER="postgres" # пользователь с правами на pg_dump PG_DB="your_database_name" # имя вашей БД (или "all" для всех) # PG_PASSWORD="secret" # ← раскомментируйте, если не используете .pgpass # Опционально: путь к pg_dump (если не в PATH) # PG_DUMP="/usr/bin/pg_dump" # Создаём папку mkdir -p "$BACKUP_DIR" # Функция логирования log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" } log "Начинаем резервное копирование PostgreSQL..." # === Установка переменных окружения (если указан пароль) === if [[ -n "${PG_PASSWORD:-}" ]]; then export PGPASSWORD="$PG_PASSWORD" fi # === Имя файла бэкапа === if [[ "$PG_DB" == "all" ]]; then BACKUP_FILE="$BACKUP_DIR/postgres-all-$DATE.sql.gz" else BACKUP_FILE="$BACKUP_DIR/postgres-${PG_DB}-$DATE.sql.gz" fi # === Создание дампа === log "Создаём дамп базы данных: $PG_DB..." if [[ "$PG_DB" == "all" ]]; then # Дамп всех баз (только структура + данные, без ролей и т.д.) pg_dumpall \ --host="$PG_HOST" \ --port="$PG_PORT" \ --username="$PG_USER" \ --clean \ --if-exists \ | gzip > "$BACKUP_FILE" else # Дамп одной базы pg_dump \ --host="$PG_HOST" \ --port="$PG_PORT" \ --username="$PG_USER" \ --dbname="$PG_DB" \ --clean \ --if-exists \ --no-owner \ --no-privileges \ | gzip > "$BACKUP_FILE" fi # Проверка, что файл создан и не пустой if [[ ! -s "$BACKUP_FILE" ]]; then log "Ошибка: дамп пустой или не создан!" >&2 exit 1 fi log "Дамп успешно сохранён: $BACKUP_FILE" # === Удаление старых бэкапов (>7 дней) по дате в имени === log "Удаляем бэкапы старше 7 дней..." cutoff=$(date -d '7 days ago' +%Y%m%d) for file in "$BACKUP_DIR"/postgres-*.sql.gz; do [[ -e "$file" ]] || continue basename_file=$(basename "$file") if [[ $basename_file =~ postgres-.*-([0-9]{8})-[0-9]{4}\.sql\.gz$ ]]; then file_date="${BASH_REMATCH[1]}" if [[ $file_date -lt $cutoff ]]; then log "Удаляем старый дамп: $file" rm -f "$file" fi fi done log "Резервное копирование PostgreSQL завершено."