gtar 增量备份失败

gtar 增量备份失败

以下脚本无法执行增量备份,而是创建完整备份。

在另一台 FreeBSD 服务器上,完全相同的脚本工作得很好(创建增量备份)。

两台机器上的服务器是相同的,相同的 FreeBSD 10.0-RELEASE。编写完全相同的脚本。 gtar 的版本是相同的。文件系统是相同的。

不知道发生了什么事。找了好几天了!请帮忙。

#!/bin/sh

sourcedir="/home"
targetdir="/backup/home"

now=$(date +"%Y%m%d%H%M")

cd $sourcedir
for dir in */
do
  base=$(basename "$dir")
  gtar -cz -g "$targetdir/.gtar-incremental" -f "$targetdir/${base}-$now.tar.gz" "/home/$dir"
  chmod 600 "$targetdir/${base}-$now.tar.gz"
done

答案1

今天花了一些时间研究这个问题,我认为这里有两个问题:

  1. 每次for循环迭代,都会创建一个新的增量文件(或者覆盖旧的文件:-)。请记住,归档文件和快照文件之间存在 1:1 映射,因此无法为gtar-incremental所有归档文件提供服务。
  2. gtar不喜欢时间戳。这是因为快照文件存储tar.gz文件名,如果传递的字符串与$now旧的字符串不同,它只会创建一个新的压缩文件和新的快照文件。

我检查它和增量工作的方式是更改行gtar

gtar --listed-incremental=$targetdir/gtar-incremental-$base  -cvzf $targetdir/$base.tar.gz $dir

这是增量工作的。

上面将为incremental正在备份的每个目录创建文件。

另一种让它在没有多个incremental文件的情况下工作的方法是将整个home目录作为一个整体而不是单个档案进行备份(即没有循环for,直接/home/backup/home.tar.gz)。

最后,我在想如果时间戳对你来说很重要,你可以gtar在文件完成后添加时间戳,也可以从文件中删除时间戳(如果在 n > 2 运行之前存在,可以用if语句构造)

时间戳对于您的操作至关重要吗?

希望这可以帮助。

相关内容