PosrgtreSQL_dump/postgresql-backup.sh

92 lines
2.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 завершено."