#!/bin/bash # === Настройки === PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin BackupDir="/mnt/backups/pgsql" LIST_FILE="/opt/scripts/pg_backup_list.lst" LOG_FILE="/var/log/pg_backup.log" # Уровень сжатия кастомного формата (0-9, по умолчанию 6) DUMP_COMPRESSION=6 # === Функции === log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # === Проверки === mkdir -p "$BackupDir" || { log "ОШИБКА: не удалось создать $BackupDir"; exit 1; } if [ ! -f "$LIST_FILE" ]; then log "ОШИБКА: файл со списком баз $LIST_FILE не найден." exit 1 fi # === Аутентификация === # Рекомендуется использовать ~/.pgpass вместо PGPASSWORD export PGPASSWORD="123456" log "=== Начало процесса бэкапа ===" # === Счётчики для отчёта === total=0 success=0 failed=0 # === Основной цикл === while IFS= read -r dbname || [ -n "$dbname" ]; do # Убираем пробелы по краям dbname="$(echo "$dbname" | xargs)" # Пропускаем пустые строки и комментарии [[ -z "$dbname" || "$dbname" =~ ^[[:space:]]*# ]] && continue total=$((total + 1)) log "[$total] Обработка базы: $dbname" temp_file="$BackupDir/${dbname}.dump.tmp" final_file="$BackupDir/${dbname}.dump" # -Fc — кастомный формат (сжатый, бинарный) # -Z — уровень сжатия (0-9) if pg_dump -h localhost -U postgres -Fc -Z "$DUMP_COMPRESSION" "$dbname" > "$temp_file"; then mv "$temp_file" "$final_file" log "Успешно создан архив: $final_file" success=$((success + 1)) else log "ОШИБКА при создании архива $dbname! Старый бэкап сохранен." rm -f "$temp_file" failed=$((failed + 1)) fi done < "$LIST_FILE" # === Ротация: удаляем бэкапы старше 7 дней === # Закомментирована #find "$BackupDir" -name "*.dump" -type f -mtime +7 -delete #log "Ротация завершена: удалены файлы старше 7 дней." # === Итог === unset PGPASSWORD log "=== Завершение: всего=$total успешно=$success ошибок=$failed ===" if [ "$failed" -gt 0 ]; then exit 1 fi