Rsync 无法正确链接增量备份

Rsync 无法正确链接增量备份

我正在使用rsync做数据的增量备份,但是由于某种原因,在3-4次适当的增量备份之后,rsync执行了全量备份,占用了两倍的空间,然后我的备份机器上的空间很快就用完了。场景是 cron 每天执行增量 rsync,然后附加脚本删除某些备份,留下:

  • 7 每日备份
  • 每周 4 次(大约)备份
  • 12 个月备份
  • 5 年度备份

这是我正在使用的脚本:

#!/bin/bash

TODAY=$(date +%Y-%m-%d)
DATADIR=/mnt/remote_ananda
BACKUPDIR=/media/backup/data
SCRIPTDIR=/media/scripts
LASTDAYPATH=${BACKUPDIR}/$(ls ${BACKUPDIR} | tail -n 1)
TODAYPATH=${BACKUPDIR}/${TODAY}
if [[ ! -e ${TODAYPATH} ]]; then
        mkdir -p ${TODAYPATH}
fi

rsync -a --link-dest ${LASTDAYPATH} ${DATADIR} ${TODAYPATH} $@

${SCRIPTDIR}/deleteOldBackups.sh

然后deleteOldBackups.sh 看起来像:

#!/bin/bash
BACKUPDIR=/media/backup/data

function listYearlyBackups() {
        for i in 0 1 2 3 4 5
                do ls ${BACKUPDIR} | egrep "$(date +%Y -d "${i} year ago")-[0-9]{2}-[0-9]{2}" | sort -u | head -n 1
        done
}

function listMonthlyBackups() {
        for i in 0 1 2 3 4 5 6 7 8 9 10 11 12
                do ls ${BACKUPDIR} | egrep "$(date +%Y-%m -d "${i} month ago")-[0-9]{2}" | sort -u | head -n 1
        done
}

function listWeeklyBackups() {
        for i in 0 1 2 3 4
                do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "last monday -${i} weeks")"
        done
}

function listDailyBackups() {
        for i in 0 1 2 3 4 5 6
                do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "-${i} day")"
        done
}

function getAllBackups() {
        listYearlyBackups
        listMonthlyBackups
        listWeeklyBackups
        listDailyBackups
}

function listUniqueBackups() {
        getAllBackups | sort -u
}

function listBackupsToDelete() {
        ls ${BACKUPDIR} | grep -v -e "$(echo -n $(listUniqueBackups) |sed "s/ /\\\|/g")"
}

cd ${BACKUPDIR}
listBackupsToDelete | while read file_to_delete; do
        rm -rf ${file_to_delete}
done

我做错了什么,在 3-4 次增量备份之后,rsync 不链接前一个,而是创建新的完整备份?谢谢

答案1

考虑将您的脚本替换为快照,这正是您想要做的。

如果不进行更多故障排除,很难准确说出脚本失败的原因,但这里有一些想法。我发现三个可能导致您出现问题的问题:

不正确$LASTDAYPATH

$BACKUPDIR如果由于某种原因写入了杂散文件/目录,则可能会发生这种情况。通过将 的值记录$LASTDAYPATH到文件中来检查这一点,以确保其设置符合您的预期。如果这是问题,您可以在设置时使用适当的 glob 来修复$LASTDAYPATH

LASTDAYPATH=${BACKUPDIR}/$(ls -d "${BACKUPDIR}"/2???-??-?? | tail -n 1)

备份的文件或元数据正在更改

--link-dest仅当大小、运行时间、所有者、组和权限匹配时才链接文件。因此,即使文件中的数据没有更改,您仍然需要对时间戳由于某种原因发生更改的文件进行完整复制。为了帮助调试此问题,请比较两个备份以查看哪些文件具有不同的索引节点号。如果索引节点匹配,则链接文件,如果不匹配,则复制这些特定文件。使用这样的命令来比较$DIR1$DIR2

diff <(cd $DIR1 && find -type f -printf "%i %p\n" | sort -k 2) <(cd $DIR2 && find -type f -printf "%i %p\n" | sort -k 2)

前一天的备份不完整

如果 rsync 由于任何原因失败,您最终将得到一个空的或部分备份,但您仍将使用它,--link-dest因为该目录存在。最好 rsync 到一个目录名称,例如partial.${TODAY},然后将其重命名为$TODAY仅当 rsync 命令完成且没有错误时。并将其与LASTDAYPATH上面的更改结合起来。

相关内容