#!/usr/bin/env bash # ============================================================ # 桃育种 Postgres 每日备份(批3 备份容灾) # - pg_dump 自定义格式(-Fc),按日期归档到 Temp/backup/ # - 保留 N 天轮转(默认 7 天,RETENTION_DAYS 可覆盖) # 用法: bash pg_backup.sh [db_name] # 覆盖: DB_HOST/DB_PORT/DB_USER/DB_NAME/PGPASSWORD/BACKUP_DIR/RETENTION_DAYS # ============================================================ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" DB_HOST="${DB_HOST:-localhost}" DB_PORT="${DB_PORT:-5432}" DB_USER="${DB_USER:-dpb}" DB_NAME="${1:-dpb}" PGPASSWORD="${PGPASSWORD:-dpb}" export PGPASSWORD BACKUP_DIR="${BACKUP_DIR:-${PROJECT_ROOT}/Temp/backup}" RETENTION_DAYS="${RETENTION_DAYS:-7}" mkdir -p "${BACKUP_DIR}" STAMP="$(date +%Y%m%d_%H%M%S)" OUT="${BACKUP_DIR}/pg_${DB_NAME}_${STAMP}.dump" if ! pg_dump -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" \ -Fc --no-owner --no-privileges -f "${OUT}" >/dev/null 2>&1; then echo "备份失败: ${OUT}" >&2 exit 1 fi # 轮转:删除 N 天前的同名库备份 find "${BACKUP_DIR}" -maxdepth 1 -name "pg_${DB_NAME}_*.dump" -mtime +"${RETENTION_DAYS}" -delete 2>/dev/null || true echo "备份完成: ${OUT} ($(du -h "${OUT}" | cut -f1))"