From 91076004499776b5f62b82affe2cc29a255809b8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 23 Jan 2026 14:44:14 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20postgresql-backup.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- postgresql-backup.sh | 92 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 postgresql-backup.sh diff --git a/postgresql-backup.sh b/postgresql-backup.sh new file mode 100644 index 0000000..0c0ade3 --- /dev/null +++ b/postgresql-backup.sh @@ -0,0 +1,92 @@ +#!/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 завершено." \ No newline at end of file