Files
dpb/backend/scripts/pg_backup.sh
T

38 lines
1.3 KiB
Bash
Raw Normal View History

#!/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))"