以下脚本无法执行增量备份,而是创建完整备份。
在另一台 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
今天花了一些时间研究这个问题,我认为这里有两个问题:
- 每次
for
循环迭代,都会创建一个新的增量文件(或者覆盖旧的文件:-)。请记住,归档文件和快照文件之间存在 1:1 映射,因此无法为gtar-incremental
所有归档文件提供服务。 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
语句构造)
时间戳对于您的操作至关重要吗?
希望这可以帮助。