Files
danyang-match/infrastructure/scripts/backup.sh
T

50 lines
1.6 KiB
Bash

#!/bin/bash
# ============================================
# 丹阳公益婚恋服务平台 — PostgreSQL 备份脚本
# ============================================
# 用法:
# ./scripts/backup.sh # 备份全部数据库
# ./scripts/backup.sh danyang_match # 备份指定库
# ./scripts/backup.sh --daily # 仅保留最近7天的备份
# ============================================
set -euo pipefail
DB_NAME="${1:-danyang_match}"
BACKUP_DIR="${BACKUP_DIR:-/app/backups}"
RETENTION_DAYS="${RETENTION_DAYS:-30}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.sql.gz"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份: ${DB_NAME}"
# 创建备份目录
mkdir -p "${BACKUP_DIR}"
# 执行备份
pg_dump \
-h "${DB_HOST:-postgres}" \
-U "${DB_USER:-danyang}" \
-d "${DB_NAME}" \
--no-owner \
--no-privileges \
--clean \
--if-exists \
--inserts \
| gzip > "${BACKUP_FILE}"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份完成: ${BACKUP_FILE}"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 文件大小: $(du -h "${BACKUP_FILE}" | cut -f1)"
# 清理过期备份
find "${BACKUP_DIR}" -name "${DB_NAME}_*.sql.gz" -mtime +${RETENTION_DAYS} -delete
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 已清理 ${RETENTION_DAYS} 天前的备份"
# 保留最近 N 份(防止误删)
BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/${DB_NAME}_*.sql.gz 2>/dev/null | wc -l)
if [ "${BACKUP_COUNT}" -gt 10 ]; then
ls -1t "${BACKUP_DIR}"/${DB_NAME}_*.sql.gz | tail -n +11 | xargs rm -f
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 保留最近10份备份,其余已清理"
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份任务完成"