You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于rdiff-backup能否删除中间增量备份而非最旧增量备份的技术咨询

关于rdiff-backup能否删除中间增量备份而非最旧增量备份的技术咨询

Hey, great question! I’ve wrestled with this exact scenario with rdiff-backup before, and while it doesn’t have a built-in one-liner for that tiered retention policy you want, you absolutely can pull this off without deleting your oldest snapshot.

Here’s how to make it work:

核心思路

rdiff-backup的--remove-older-than命令比较“一刀切”(会删除所有早于指定时间的备份),但它的--remove-increments命令支持精准删除特定的增量快照。我们可以结合简单脚本筛选出不需要的中间快照,同时保留最旧的全量备份和长期需要的周/月快照。

具体实现步骤

  1. 先列出所有现有增量快照,明确备份状态:

    rdiff-backup list increments /path/to/your/backup/directory
    

    这个命令会输出所有增量快照的时间戳,以及当前的镜像状态。

  2. 用脚本精准删除中间增量
    你可以写一个简单的bash脚本(或用熟悉的其他脚本语言)实现以下逻辑:

    • 跳过最旧的快照(确保它永远不会被删除)
    • 对1年以上、2年以内的快照:只保留每周固定时间(比如周日)的快照,删除其余中间增量
    • 对2年以上的快照:只保留每月固定日期(比如1号)的快照,删除其余中间增量

    下面是一个示例bash脚本(可以根据自己的偏好调整周/月的时间规则):

    #!/bin/bash
    BACKUP_DIR="/path/to/your/backup/directory"
    
    # 获取所有增量时间戳,排除最旧的快照(最后一行)和当前镜像状态
    INCREMENTS=$(rdiff-backup list increments "$BACKUP_DIR" | grep -v "Current mirror" | head -n -1 | awk '{print $1}')
    
    # 定义时间阈值(单位:秒)
    ONE_YEAR=$((365 * 24 * 60 * 60))
    TWO_YEARS=$((2 * ONE_YEAR))
    NOW=$(date +%s)
    
    for INC_TIMESTAMP in $INCREMENTS; do
        # 将增量时间戳转换为时间戳秒数
        INC_TIME=$(date -d "$INC_TIMESTAMP" +%s)
        TIME_DIFF=$((NOW - INC_TIME))
    
        if [[ $TIME_DIFF -gt $ONE_YEAR && $TIME_DIFF -lt $TWO_YEARS ]]; then
            # 只保留周日的快照(%u格式中7代表周日,1代表周一)
            DAY_OF_WEEK=$(date -d "$INC_TIMESTAMP" +%u)
            if [[ $DAY_OF_WEEK -ne 7 ]]; then
                # 先试运行!确认无误后再移除--dry-run参数
                rdiff-backup --dry-run --remove-increments "$INC_TIMESTAMP" "$BACKUP_DIR"
            fi
        elif [[ $TIME_DIFF -gt $TWO_YEARS ]]; then
            # 只保留每月1号的快照
            DAY_OF_MONTH=$(date -d "$INC_TIMESTAMP" +%d)
            if [[ $DAY_OF_MONTH -ne "01" ]]; then
                # 先试运行!确认无误后再移除--dry-run参数
                rdiff-backup --dry-run --remove-increments "$INC_TIMESTAMP" "$BACKUP_DIR"
            fi
        fi
    done
    
  3. 运行前的关键注意事项

    • 一定要先加--dry-run参数试运行!它会显示哪些增量会被删除,但不会实际执行删除操作
    • 脚本通过head -n -1排除了list increments输出的最后一行(也就是最旧的快照),确保它不会被触碰
    • 可以根据自己的备份习惯调整周/月的保留规则(比如改成每周一、每月5号等)

最后补充

用这种方法完全不需要删除最旧的增量备份,脚本只会针对不符合分层保留规则的中间快照进行清理,你的原始全量备份会一直保留下来。

备注:内容来源于stack exchange,提问作者Nick S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:13:05