#!/bin/bash # 智能项目定价模型 - 数据库备份脚本 # 遵循瑞小美部署规范 set -e # 配置 BACKUP_DIR="/data/backups/pricing_model" RETENTION_DAYS=7 DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="pricing_model_${DATE}.sql.gz" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1" } # 加载环境变量 load_env() { cd "$(dirname "$0")/.." if [ -f ".env" ]; then source .env else log_error ".env 文件不存在" exit 1 fi } # 创建备份目录 create_backup_dir() { if [ ! -d "$BACKUP_DIR" ]; then mkdir -p "$BACKUP_DIR" chmod 700 "$BACKUP_DIR" fi } # 执行备份 do_backup() { log_info "开始备份数据库..." # 使用 docker exec 执行 mysqldump docker exec pricing-mysql mysqldump \ -u root \ -p"${MYSQL_ROOT_PASSWORD}" \ --single-transaction \ --routines \ --triggers \ --databases pricing_model \ 2>/dev/null | gzip > "${BACKUP_DIR}/${BACKUP_FILE}" if [ $? -eq 0 ]; then local size=$(du -h "${BACKUP_DIR}/${BACKUP_FILE}" | cut -f1) log_info "备份完成: ${BACKUP_FILE} (${size})" else log_error "备份失败" rm -f "${BACKUP_DIR}/${BACKUP_FILE}" exit 1 fi } # 清理旧备份 cleanup_old_backups() { log_info "清理 ${RETENTION_DAYS} 天前的备份..." local deleted=0 while IFS= read -r file; do rm -f "$file" deleted=$((deleted + 1)) done < <(find "$BACKUP_DIR" -name "pricing_model_*.sql.gz" -mtime +${RETENTION_DAYS} -type f) if [ $deleted -gt 0 ]; then log_info "已删除 ${deleted} 个旧备份" fi } # 列出备份 list_backups() { log_info "备份列表:" echo "" ls -lh "${BACKUP_DIR}"/pricing_model_*.sql.gz 2>/dev/null || echo "暂无备份" echo "" } # 恢复备份 restore_backup() { local backup_file="$1" if [ -z "$backup_file" ]; then log_error "请指定备份文件" list_backups exit 1 fi if [ ! -f "$backup_file" ]; then # 尝试在备份目录中查找 backup_file="${BACKUP_DIR}/${backup_file}" if [ ! -f "$backup_file" ]; then log_error "备份文件不存在: $backup_file" exit 1 fi fi log_warn "即将恢复数据库,当前数据将被覆盖!" read -p "确认恢复? (yes/no): " confirm if [ "$confirm" != "yes" ]; then log_info "取消恢复" exit 0 fi log_info "开始恢复数据库..." gunzip -c "$backup_file" | docker exec -i pricing-mysql mysql \ -u root \ -p"${MYSQL_ROOT_PASSWORD}" \ 2>/dev/null if [ $? -eq 0 ]; then log_info "数据库恢复完成" else log_error "恢复失败" exit 1 fi } # 主函数 main() { local action="${1:-backup}" load_env create_backup_dir case $action in backup) do_backup cleanup_old_backups ;; restore) restore_backup "$2" ;; list) list_backups ;; cleanup) cleanup_old_backups ;; *) echo "用法: $0 {backup|restore |list|cleanup}" echo "" echo "命令:" echo " backup 执行备份" echo " restore 恢复指定备份" echo " list 列出所有备份" echo " cleanup 清理旧备份" exit 1 ;; esac } main "$@"