#!/bin/bash ################################################################################ # FLNXI素材库共享平台 - 数据库自动备份脚本 # 功能:自动备份PostgreSQL数据库(不包含源素材文件) # 使用:./backup-database.sh ################################################################################ # 配置 BACKUP_DIR="/mnt/PoolOne/backups/youyidian-3d" DB_HOST="192.168.58.20" DB_PORT="5432" DB_NAME="lobechat" DB_USER="gongxiangpan" DB_PASS="gongxiangpan123" KEEP_DAYS=30 # 保留最近30天的备份 # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } # 创建备份目录 create_backup_dirs() { log_info "创建备份目录..." mkdir -p "$BACKUP_DIR/database" mkdir -p "$BACKUP_DIR/logs" } # 备份数据库 backup_database() { local timestamp=$(date +%Y%m%d_%H%M%S) local backup_file="$BACKUP_DIR/database/db_backup_${timestamp}.sql.gz" log_info "开始备份数据库..." # 使用Docker运行pg_dump docker run --rm \ -e PGPASSWORD="$DB_PASS" \ postgres:15-alpine \ pg_dump \ -h "$DB_HOST" \ -p "$DB_PORT" \ -U "$DB_USER" \ -d "$DB_NAME" \ --no-owner \ --no-acl \ 2>/dev/null | gzip > "$backup_file" if [ $? -eq 0 ] && [ -f "$backup_file" ]; then local size=$(du -h "$backup_file" | cut -f1) log_info "数据库备份成功: $backup_file (大小: $size)" return 0 else log_error "数据库备份失败" rm -f "$backup_file" return 1 fi } # 清理旧备份 cleanup_old_backups() { log_info "清理超过 ${KEEP_DAYS} 天的旧备份..." # 清理数据库备份 local db_deleted=$(find "$BACKUP_DIR/database" -name "db_backup_*.sql.gz" -mtime +$KEEP_DAYS -delete -print | wc -l) if [ $db_deleted -gt 0 ]; then log_info "删除了 $db_deleted 个旧数据库备份" fi # 清理旧日志 find "$BACKUP_DIR/logs" -name "backup_*.log" -mtime +$KEEP_DAYS -delete } # 生成备份报告 generate_report() { local report_file="$BACKUP_DIR/logs/backup_$(date +%Y%m%d_%H%M%S).log" cat > "$report_file" << EOF ================================================================================ 数据库备份报告 ================================================================================ 备份时间: $(date '+%Y-%m-%d %H:%M:%S') 数据库: $DB_NAME@$DB_HOST:$DB_PORT --- 备份统计 --- 数据库备份数量: $(ls -1 "$BACKUP_DIR/database" 2>/dev/null | wc -l) 最旧备份: $(ls -t "$BACKUP_DIR/database" 2>/dev/null | tail -n 1 | xargs stat -c %y 2>/dev/null | cut -d' ' -f1) 最新备份: $(ls -t "$BACKUP_DIR/database" 2>/dev/null | head -n 1 | xargs stat -c %y 2>/dev/null | cut -d' ' -f1) --- 磁盘使用 --- 数据库备份占用: $(du -sh "$BACKUP_DIR/database" 2>/dev/null | cut -f1) 总计占用: $(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1) --- 最新5个备份 --- $(ls -lht "$BACKUP_DIR/database" 2>/dev/null | head -n 6 | tail -n 5) ================================================================================ EOF log_info "备份报告已生成: $report_file" } # 测试数据库连接 test_connection() { log_info "测试数据库连接..." docker run --rm \ -e PGPASSWORD="$DB_PASS" \ postgres:15-alpine \ psql \ -h "$DB_HOST" \ -p "$DB_PORT" \ -U "$DB_USER" \ -d "$DB_NAME" \ -c "SELECT 1;" >/dev/null 2>&1 if [ $? -eq 0 ]; then log_info "数据库连接成功" return 0 else log_error "数据库连接失败" return 1 fi } # 主函数 main() { echo "" echo "========================================" echo " FLNXI素材库 - 数据库备份" echo "========================================" echo "" # 测试连接 if ! test_connection; then log_error "备份终止:无法连接到数据库" exit 1 fi # 创建目录 create_backup_dirs # 执行备份 local db_status=0 backup_database || db_status=1 # 清理旧备份 cleanup_old_backups # 生成报告 generate_report # 汇总结果 echo "" echo "========================================" echo " 备份完成" echo "========================================" if [ $db_status -eq 0 ]; then log_info "数据库备份任务成功完成" exit 0 else log_error "数据库备份任务失败" exit 1 fi } # 执行主函数 main "$@"