#!/bin/bash # =========================================== # 数据库备份脚本 # 用途: 备份 PostgreSQL 数据库到本地文件 # 建议: 每天通过 cron 执行一次 # Crontab 示例: # 0 4 * * * /root/rust/rust_backend/scripts/backup-db.sh >> /root/rust/rust_backend/logs/backup.log 2>&1 # =========================================== set -euo pipefail DB_CONTAINER="1Panel-postgresql-FtMo" DB_NAME="${1:-milkydata}" DB_USER="milkydata" BACKUP_DIR="/root/rust/rust_backend/backups" RETENTION_DAYS=7 LOG_PREFIX="[$(date '+%Y-%m-%d %H:%M:%S')]" echo "$LOG_PREFIX 开始备份数据库: ${DB_NAME}" # 确保备份目录存在 mkdir -p "$BACKUP_DIR" # 检查容器是否运行 if ! docker ps --format '{{.Names}}' | grep -q "^${DB_CONTAINER}$"; then echo "$LOG_PREFIX 错误: Docker 容器 ${DB_CONTAINER} 未运行" exit 1 fi # 执行备份(自定义格式,可压缩) BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_$(date +%Y%m%d_%H%M%S).dump" echo "$LOG_PREFIX 导出到: ${BACKUP_FILE}" docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" -Fc "$DB_NAME" > "$BACKUP_FILE" # 检查备份是否成功 if [ -f "$BACKUP_FILE" ] && [ -s "$BACKUP_FILE" ]; then FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1) echo "$LOG_PREFIX 备份成功: ${BACKUP_FILE} (${FILE_SIZE})" else echo "$LOG_PREFIX 错误: 备份文件为空或不存在" exit 1 fi # 删除旧备份(保留 RETENTION_DAYS 天) echo "$LOG_PREFIX 清理 ${RETENTION_DAYS} 天前的旧备份..." find "$BACKUP_DIR" -name "${DB_NAME}_*.dump" -mtime "+${RETENTION_DAYS}" -delete # 记录保留的备份 echo "$LOG_PREFIX 当前备份列表:" ls -lh "$BACKUP_DIR"/*.dump 2>/dev/null || echo " (无备份文件)" echo "$LOG_PREFIX 备份完成"