#!/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')] 备份任务完成"