Oracle-backup-v2.0.0.sh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #!/bin/bash
  2. # 基础配置
  3. backup_dir="/mnt/mydata/backup" # 本地备份路径
  4. data_dir="/mnt/mydata" # 要备份的目录
  5. hostname=$(hostname) # 获取主机名
  6. cloud_dir="backup/$hostname" # 云端存储路径,使用hostname区分
  7. log_file="/var/log/bypy_backup.log" # 日志文件
  8. max_cloud_backups=2 # 云端最多保留的备份数量
  9. # 日志函数
  10. log_message() {
  11. echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$log_file"
  12. echo "$1"
  13. }
  14. # 创建本地备份目录
  15. mkdir -p "$backup_dir"
  16. # 生成备份文件名
  17. backup_file="backup-$hostname-$(date +'%Y-%m-%d').tar.gz"
  18. backup_path="$backup_dir/$backup_file"
  19. # 1. 创建新备份
  20. log_message "开始创建备份文件..."
  21. tar -czf "$backup_path" \
  22. --exclude="$data_dir/.Recycle_bin" \
  23. --exclude="$backup_dir" \
  24. "$data_dir" 2>/dev/null
  25. if [ $? -eq 0 ]; then
  26. log_message "备份文件创建成功: $backup_path"
  27. else
  28. log_message "备份文件创建失败"
  29. exit 1
  30. fi
  31. # 2. 清理本地旧备份
  32. num_local_backups=$(ls -l "$backup_dir" | grep ^- | grep 'backup-' | wc -l)
  33. if [ $num_local_backups -gt 1 ]; then
  34. oldest_local_backup=$(ls -t "$backup_dir" | grep 'backup-' | tail -1)
  35. rm "$backup_dir/$oldest_local_backup"
  36. log_message "删除本地旧备份: $oldest_local_backup"
  37. fi
  38. # 3. 同步到云端
  39. log_message "确保云端目录存在..."
  40. /www/server/pyporject_evn/versions/3.13.0/bin/bypy mkdir "$cloud_dir"
  41. log_message "开始上传到云端..."
  42. /www/server/pyporject_evn/versions/3.13.0/bin/bypy syncup "$backup_dir" "$cloud_dir" 2>&1 | while IFS= read -r line; do
  43. if [[ $line =~ ^\[.*%.*MB\/.*MB.*ETA.* ]] || [[ $line =~ ^Done$ ]] || [[ $line == *"100%"* ]]; then
  44. echo "$line"
  45. echo "$(date +'%Y-%m-%d %H:%M:%S') - $line" >> "$log_file"
  46. fi
  47. done
  48. # 4. 清理云端旧备份
  49. log_message "清理云端旧备份..."
  50. cloud_backups=$(/www/server/pyporject_evn/versions/3.13.0/bin/bypy list "$cloud_dir" | grep "backup-" | awk '{print $NF}')
  51. cloud_backup_count=$(echo "$cloud_backups" | wc -l)
  52. if [ "$cloud_backup_count" -gt "$max_cloud_backups" ]; then
  53. old_cloud_backups=$(echo "$cloud_backups" | head -n -$max_cloud_backups)
  54. while IFS= read -r backup; do
  55. /www/server/pyporject_evn/versions/3.13.0/bin/bypy delete "$cloud_dir/$backup"
  56. log_message "删除云端旧备份: $backup"
  57. done <<< "$old_cloud_backups"
  58. fi
  59. log_message "云端备份清理完成"
  60. # 显示当前云端备份列表
  61. log_message "当前云端备份列表:"
  62. /www/server/pyporject_evn/versions/3.13.0/bin/bypy list "$cloud_dir" >> "$log_file"