强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Rclone 数据迁移完全指南 / 第 6 章 - 数据同步

第 6 章 - 数据同步


6.1 同步模式概述

Rclone 提供多种同步模式,适用于不同场景:

模式命令方向删除多余文件适用场景
复制copy单向增量备份
同步sync单向镜像同步
移动move单向数据迁移
双向同步bisync双向多端协作

6.2 单向同步(sync)

基本原理

源端 (Source)                    目标端 (Destination)
┌──────────┐                   ┌──────────┐
│ a.txt ✓  │ ──── 同步 ────▶ │ a.txt ✓  │
│ b.txt ✓  │ ──── 同步 ────▶ │ b.txt ✓  │
│ c.txt ✓  │ ──── 同步 ────▶ │ c.txt ✓  │
└──────────┘                   │ d.txt ✗  │ ← 被删除
                               └──────────┘

基本命令

# 同步本地目录到 S3
rclone sync /data/project/ s3:my-bucket/project/ --progress

# 同步 Google Drive 到 OneDrive
rclone sync gdrive:Documents/ onedrive:Documents/ --progress

# 同步到 NAS
rclone sync /home/user/ sftp-nas:/backup/user/ --progress

⚠️ sync 的关键提醒

# sync 会删除目标端不在源端的所有文件
# 这是单向镜像,方向性非常强

# 🔴 务必确认:
# 1. 源端路径正确(不要搞反)
# 2. 目标路径正确(不要同步到错误位置)
# 3. 先用 --dry-run 预览

rclone sync /data/ s3:backup/ --dry-run -v

6.3 增量传输

Rclone 的 synccopy 都是增量传输,只传输有变化的文件。

判断文件是否需要传输

Rclone 使用以下策略判断文件是否需要更新(按优先级):

策略参数说明适用场景
修改时间 + 大小默认比较 modtime 和 size大多数场景
校验和--checksum比较 hash 值需要精确校验
仅大小--size-only只比较文件大小时间戳不可靠时
仅修改时间--ignore-size只比较修改时间文件大小可能变化但内容未变

使用校验和同步

# 使用校验和比较(更精确但更慢)
rclone sync src dst --checksum --progress

# 查看远程存储支持的哈希算法
rclone backend features s3:my-bucket/ | grep -A5 "Hashes"

更新模式

# 只传输更新的文件(源端修改时间比目标端新)
rclone sync src dst --update --progress

6.4 检查策略

传输前检查

# 检查源端和目标端的差异(不传输)
rclone check /data/ s3:my-backup/

# 输出示例:
# 2026/01/01 00:00:00 NOTICE: S3 bucket my-backup: 2 differences found
# ERROR : file1.txt: hash differ
# ERROR : new-file.txt: file not found in source

# JSON 格式输出差异
rclone check /data/ s3:my-backup/ --combined check-result.json

传输后校验

# 同步后自动校验
rclone sync /data/ s3:backup/ --check-first --progress

# --check-first 先检查再传输,提高安全性

下载校验

# 最严格:下载文件内容进行逐字节比较
rclone check /data/ s3:backup/ --download

6.5 删除策略

默认行为

# sync 默认删除目标端多余文件
rclone sync src dst

# 使用 --delete-before:传输前删除
rclone sync src dst --delete-before

# 使用 --delete-during:传输过程中删除(默认)
rclone sync src dst --delete-during

# 使用 --delete-after:传输完成后删除
rclone sync src dst --delete-after

保护特定文件

# 同步但不删除目标端的 .md 文件
rclone sync src dst --filter "- *.md" --delete-excluded

# 使用 --backup-dir 保留被删除的文件
rclone sync src dst --backup-dir s3:backup/removed/ --progress

# 被删除的文件会移动到 backup-dir,而不是直接删除

删除策略对比

策略说明安全性速度
--delete-before先删后传
--delete-during边传边删
--delete-after先传后删

6.6 冲突处理

冲突场景

当源端和目标端文件都有修改时,就产生了冲突:

源端: file.txt (修改时间 2026-05-01, 内容: "Version B")
目标端: file.txt (修改时间 2026-05-02, 内容: "Version A")

# sync 会用源端覆盖目标端,目标端的修改丢失!

处理策略

策略 1:先备份再同步

# 先备份目标端的修改
rclone sync dst s3:conflict-backup/$(date +%Y%m%d)/ --progress

# 再执行同步
rclone sync src dst --progress

策略 2:使用 –backup-dir

# 被覆盖/删除的文件自动备份到指定目录
rclone sync src dst \
  --backup-dir s3:backup/conflicts/$(date +%Y%m%d)/ \
  --progress

策略 3:使用 –update 只更新较新的

# 只传输源端比目标端更新的文件
rclone sync src dst --update --progress

策略 4:使用 bisync 双向同步

# 使用 bisync 自动处理冲突(详见第 10 章)
rclone bisync src dst --resync

6.7 日志记录

基本日志

# 输出日志到文件
rclone sync src dst --log-file /var/log/rclone-sync.log --log-level INFO

# 日志级别:DEBUG / INFO / NOTICE / ERROR

日志格式

# 标准格式
2026/05/10 12:00:00 INFO  : file1.txt: Copied (new)
2026/05/10 12:00:01 INFO  : file2.txt: Deleted
2026/05/10 12:00:02 ERROR : file3.txt: Failed to copy: timeout

# JSON 格式
rclone sync src dst --log-file sync.log --log-format JSON

统计信息

# 定期输出统计信息
rclone sync src dst --stats 5s --progress

# 输出示例:
# Transferred:   1.234 GiB / 5.000 GiB, 25%, 50.000 MiB/s, ETA 1m20s
# Errors:        2
# Checks:        1234 / 1234, 100%
# Transferred:   100 / 500, 20%
# Elapsed time:  30.0s

日志轮转

# 使用 logrotate 管理日志
cat > /etc/logrotate.d/rclone << 'EOF'
/var/log/rclone-sync.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0644 root root
}
EOF

6.8 性能调优

并行传输

# 增加并行传输数(默认 4)
rclone sync src dst --transfers 16

# 增加并行检查数(默认 8)
rclone sync src dst --checkers 32

# 单文件多线程(大文件分块传输)
rclone sync src dst --multi-thread-streams 8

缓冲区大小

# 增大内存缓冲区
rclone sync src dst --buffer-size 64Mi

# 每个传输文件使用 64MiB 的内存缓冲

带宽限制

# 限制总带宽为 10MB/s
rclone sync src dst --bwlimit 10M

# 工作时间限制带宽,其他时间不限
rclone sync src dst --bwlimit "08:00,10M 23:00,off"

# 按星期限制
rclone sync src dst --bwlimit "Mon-08:00,5M Mon-23:00,off"

大量小文件优化

# 对于大量小文件,增加 transfers 数量
rclone sync src dst \
  --transfers 32 \
  --checkers 64 \
  --low-level-retries 10 \
  --retries 3 \
  --retries-sleep 1s

大文件优化

# 对于大文件,增加单文件多线程
rclone sync src dst \
  --transfers 4 \
  --multi-thread-streams 8 \
  --multi-thread-cutoff 256M \
  --buffer-size 64Mi

6.9 完整脚本示例

每日增量备份脚本

#!/bin/bash
# daily-backup.sh - 每日增量备份

set -euo pipefail

# 配置
SOURCE="/data/important/"
DEST="s3:my-backup/daily/"
BACKUP_DIR="s3:my-backup/deleted/$(date +%Y%m%d)/"
LOG_FILE="/var/log/rclone-backup-$(date +%Y%m%d).log"
LOCK_FILE="/tmp/rclone-backup.lock"

# 加锁防止重复运行
exec 200>"$LOCK_FILE"
flock -n 200 || { echo "Backup already running"; exit 1; }

# 执行同步
rclone sync "$SOURCE" "$DEST" \
  --backup-dir "$BACKUP_DIR" \
  --transfers 8 \
  --checkers 16 \
  --progress \
  --log-file "$LOG_FILE" \
  --log-level INFO \
  --stats 30s \
  --exclude "*.tmp" \
  --exclude "*.temp" \
  --exclude ".cache/**" \
  --exclude "node_modules/**"

# 检查结果
if [ $? -eq 0 ]; then
  echo "Backup completed successfully" >> "$LOG_FILE"
else
  echo "Backup FAILED" >> "$LOG_FILE"
  # 发送告警
  echo "Backup failed on $(date)" | mail -s "Backup Alert" [email protected]
fi

# 清理 30 天前的日志
find /var/log/ -name "rclone-backup-*" -mtime +30 -delete

灾难恢复脚本

#!/bin/bash
# restore.sh - 从备份恢复数据

set -euo pipefail

# 配置
BACKUP="s3:my-backup/daily/"
RESTORE_DIR="/data/restore/"
DATE="${1:-latest}"

if [ "$DATE" = "latest" ]; then
  echo "Restoring from latest backup..."
  rclone copy "$BACKUP" "$RESTORE_DIR" --progress --transfers 8
else
  echo "Restoring from $DATE..."
  rclone copy "s3:my-backup/daily/" "$RESTORE_DIR" \
    --max-age "$DATE" --progress
fi

echo "Restore completed. Please verify the data."

注意事项

⚠️ sync 方向rclone sync A B 让 B 变成 A 的镜像。永远先用 --dry-run 确认

⚠️ 备份目录:使用 --backup-dir 可以保留被覆盖/删除的文件,强烈建议在生产环境启用。

⚠️ 大目录首次同步:首次同步大量数据时,建议使用 --transfers--checkers 调优参数。

💡 增量传输:Rclone 天然支持增量传输,重复运行同步命令是安全且高效的。

💡 监控:使用 --log-file--stats 记录每次同步的详情,便于排查问题。


扩展阅读


上一章← 第 5 章 - 文件过滤 下一章第 7 章 - 挂载远程存储 →