#!/bin/bash # MySQL 数据库备份脚本 # 用法: ./backup-db.sh # 需要 .env 中配置 DATABASE_URL 或 DB_* 环境变量 set -e BACKUP_DIR="${BACKUP_DIR:-./backups}" RETENTION_DAYS="${RETENTION_DAYS:-30}" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_FILE="${BACKUP_DIR}/db_backup_${TIMESTAMP}.sql.gz" # 从 DATABASE_URL 解析连接信息 # 格式: mysql://user:password@host:port/dbname DATABASE_URL="${DATABASE_URL:-}" if [ -z "$DATABASE_URL" ]; then echo "ERROR: DATABASE_URL not set" exit 1 fi # 解析 URL DB_USER=$(echo $DATABASE_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p') DB_PASS=$(echo $DATABASE_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p') DB_HOST=$(echo $DATABASE_URL | sed -n 's/.*@\([^:]*\):.*/\1/p') DB_PORT=$(echo $DATABASE_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p') DB_NAME=$(echo $DATABASE_URL | sed -n 's/.*\/\([^?]*\).*/\1/p') echo "Backing up database: $DB_NAME from $DB_HOST:$DB_PORT" # 创建备份目录 mkdir -p "$BACKUP_DIR" # 执行备份 mysqldump -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_FILE" echo "Backup created: $BACKUP_FILE" echo "Size: $(du -h $BACKUP_FILE | cut -f1)" # 清理旧备份 find "$BACKUP_DIR" -name "db_backup_*.sql.gz" -mtime +$RETENTION_DAYS -delete echo "Cleaned up backups older than $RETENTION_DAYS days" # 列出当前备份 echo "Current backups:" ls -lh "$BACKUP_DIR"/db_backup_*.sql.gz 2>/dev/null | tail -10