甲骨文服务器多目录备份到Google Drive的完整教程
准备工作
配置rclone服务:
- 确保已在甲骨文服务器上配置好rclone
- 已为rclone挂载Google Drive或其他云存储(如通过alist)
验证rclone配置:
rclone listremotes
应显示配置的远程名称(如
googledrive:
)
备份脚本设置
1. 创建备份脚本文件
在/root/
目录下创建root_multi_backup.sh
文件:
#!/bin/bash
# ========================
# 备份配置
# ========================
CONFIG_FILE="/root/backup_directories.txt" # 备份目录列表文件
REMOTE_NAME="googledrive" # rclone配置的远程名称
BACKUP_DIR="backup" # 云盘上的备份目录名称
MAX_BACKUPS=3 # 保留的备份数量
LOG_DIR="/root/backup_logs" # 日志文件目录
# ========================
# 初始化设置
# ========================
DATE=$(date +"%Y-%m-%d_%H-%M-%S") # 当前日期和时间
BACKUP_NAME="backup_${DATE}" # 备份文件夹名称
LOG_FILE="${LOG_DIR}/backup_${DATE}.log" # 日志文件路径
# 创建日志目录
mkdir -p "$LOG_DIR"
# ========================
# 日志函数
# ========================
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
log_divider() {
echo "=====================================================" | tee -a "$LOG_FILE"
}
log_header() {
log_divider
log "$1"
log_divider
}
# ========================
# 备份开始
# ========================
log_header "备份开始"
log "执行用户: $(whoami)"
log "备份名称: $BACKUP_NAME"
# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
log "错误:此脚本必须以root身份运行!"
exit 1
fi
# 检查配置文件
if [ ! -f "$CONFIG_FILE" ]; then
log "错误:配置文件 $CONFIG_FILE 不存在!"
exit 1
fi
# 创建云盘备份目录
log "创建云盘备份目录: ${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}"
rclone mkdir "${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}" 2>&1 | tee -a "$LOG_FILE"
# ========================
# 执行备份
# ========================
while IFS= read -r SOURCE_DIR || [[ -n "$SOURCE_DIR" ]]; do
# 跳过空行和注释
[[ -z "$SOURCE_DIR" || "$SOURCE_DIR" =~ ^# ]] && continue
# 移除前后空格
SOURCE_DIR=$(echo "$SOURCE_DIR" | xargs)
DIR_NAME=$(basename "$SOURCE_DIR")
log_header "正在备份: $SOURCE_DIR"
# 检查目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
log "警告:目录 $SOURCE_DIR 不存在,跳过"
continue
fi
# 计算目录信息
log "计算目录大小和文件数量..."
DIR_SIZE=$(du -sh "$SOURCE_DIR" 2>/dev/null | cut -f1)
FILE_COUNT=$(find "$SOURCE_DIR" -type f | wc -l)
log "目录大小: $DIR_SIZE | 文件数量: $FILE_COUNT"
# 执行备份
log "开始复制文件到云盘..."
rclone copy "$SOURCE_DIR" "${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}/${DIR_NAME}" \
--progress \
--stats-one-line-date \
--stats=5s \
-v 2>&1 | tee -a "$LOG_FILE"
# 检查结果
if [ $? -eq 0 ]; then
log "✓ 备份成功: $SOURCE_DIR"
else
log "✗ 备份失败: $SOURCE_DIR"
fi
done < "$CONFIG_FILE"
# ========================
# 备份管理
# ========================
log_header "管理旧备份"
# 获取备份列表并按日期排序
BACKUPS=$(rclone lsf "${REMOTE_NAME}:${BACKUP_DIR}" | sort)
BACKUP_COUNT=$(echo "$BACKUPS" | wc -l)
log "当前备份数量: $BACKUP_COUNT (最多保留 $MAX_BACKUPS 个)"
# 删除多余备份
if [ "$BACKUP_COUNT" -gt $MAX_BACKUPS ]; then
DELETE_COUNT=$((BACKUP_COUNT - MAX_BACKUPS))
TO_DELETE=$(echo "$BACKUPS" | head -n $DELETE_COUNT)
log "将删除 $DELETE_COUNT 个旧备份:"
echo "$TO_DELETE" | while read -r backup; do
log "删除: ${backup}"
rclone purge "${REMOTE_NAME}:${BACKUP_DIR}/${backup}" -v 2>&1 | tee -a "$LOG_FILE"
done
fi
# ========================
# 日志管理
# ========================
log_header "管理日志文件"
# 保留最新的3个日志文件
find "$LOG_DIR" -name "backup_*.log" -type f | sort -r | awk -v max=$MAX_BACKUPS 'NR>max {print}' | xargs rm -f
log "当前日志文件:"
ls -lh "$LOG_DIR"/backup_*.log 2>/dev/null | tee -a "$LOG_FILE"
# ========================
# 备份完成
# ========================
log_header "备份完成"
log "日志文件: $LOG_FILE"
2. 创建备份目录列表文件
创建/root/backup_directories.txt
文件,每行一个要备份的目录:
/opt
# /home # 注释示例,如需备份取消注释
# /var/www
设置与测试
添加执行权限:
chmod +x /root/root_multi_backup.sh
测试脚本:
/root/root_multi_backup.sh
检查日志:
ls -lh /root/backup_logs/ tail -f /root/backup_logs/backup_*.log
自动化设置
1panel面板设置
- 进入1Panel控制面板
- 导航到"计划任务"
创建新任务:
- 任务类型:Shell脚本
- 任务名称:Daily Backup
- 执行周期:每天
- 执行时间:建议设置为服务器负载低的时段(如凌晨2点)
脚本内容:
/root/root_multi_backup.sh
手动设置cron任务(备用方案)
如果使用原生cron,可以添加:
(crontab -l ; echo "0 2 * * * /root/root_multi_backup.sh") | crontab -
高级优化建议
- 增量备份:考虑使用
rclone sync
代替copy
进行增量备份 - 压缩备份:对大文件目录先压缩再备份
- 通知功能:添加邮件或Webhook通知备份结果
- 错误处理:对关键步骤添加更详细的错误检查和重试机制
- 性能监控:记录备份耗时和传输速度
故障排除
权限问题:
- 确保脚本以root权限执行
- 检查rclone配置文件的权限
rclone连接问题:
rclone ls ${REMOTE_NAME}:${BACKUP_DIR}
空间不足:
rclone about ${REMOTE_NAME}:
查看详细日志:
journalctl -u cron.service -n 50 --no-pager