我正在使用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
上面的更改结合起来。