38 lines
1.3 KiB
Bash
38 lines
1.3 KiB
Bash
#!/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))"
|