50 lines
1.6 KiB
Bash
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')] 备份任务完成"
|