首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rsync增量备份仍然复制所有文件。

Rsync增量备份仍然复制所有文件。
EN

Unix & Linux用户
提问于 2021-11-20 22:16:29
回答 1查看 458关注 0票数 1

我目前正在为rsync编写bash脚本。我很确定我做错了什么。但我不知道是什么。我将尽力详细阐述每件事,希望有人能帮助我。

脚本的目标是使用rsync完成完整备份和增量备份。除了一件至关重要的事情外,一切似乎都很顺利。看起来,即使使用--link-dest参数,它仍然复制所有文件。我已经用du -chs检查了文件大小。

首先是我的剧本:

代码语言:javascript
复制
#!/bin/sh
while getopts m:p: flags
do
  case "$flags" in
    m) mode=${OPTARG};;
    p) prev=${OPTARG};;
    *) echo "usage: $0 [-m] [-p]" >&2
       exit 1 ;;
  esac
done

date="$(date '+%Y-%m-%d')";


#Create Folders If They Do Not Exist (-p paramter)
mkdir -p /Backups/Full && mkdir -p /Backups/Inc

FullBackup() {
  #Backup Content Of Website
  mkdir -p /Backups/Full/$date/Web/html
  rsync -av user@IP:/var/www/html/ /Backups/Full/$date/Web/html/

  #Backup All Config Files NEEDED. Saving Storage Is Key ;)
  mkdir -p /Backups/Full/$date/Web/etc
  rsync -av user@IP:/etc/apache2/ /Backups/Full/$date/Web/etc/

  #Backup Fileserver
  mkdir -p /Backups/Full/$date/Fileserver
  rsync -av user@IP:/srv/samba/private/ /Backups/Full/$date/Fileserver/

  #Backup MongoDB
  ssh user@IP /usr/bin/mongodump --out /home/DB
  rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
  ssh user@IP rm -rf /home/DB
}

IncrementalBackup(){
  Method="";
  if [ "$prev" == "full" ]
  then
    Method="Full";
  elif [ "$prev" == "inc" ]
  then
    Method="Inc";
  fi

  if [ -z "$prev" ]
  then
  echo "-p Parameter Empty";
  else
  #Get Latest Folder - Ignore the hacky method, it works.
  cd /Backups/$Method
  NewestBackup=$(find . ! -path . -type d | sort -nr | head -1 | sed s@^./@@)
  IFS='/'
  read -a strarr <<< "$NewestBackup"
  Latest_Backup="${strarr[0]}";
  cd /Backups/

  #Incremental-Backup Content Of Website
  mkdir -p /Backups/Inc/$date/Web/html
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/html/ user@IP:/var/www/html/ /Backups/Inc/$date/Web/html/

  #Incremental-Backup All Config Files NEEDED
  mkdir -p /Backups/Inc/$date/Web/etc
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/etc/ user@IP:/etc/apache2/ /Backups/Inc/$date/Web/etc/

  #Incremental-Backup Fileserver
  mkdir -p /Backups/Inc/$date/Fileserver
  rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Fileserver/ user@IP:/srv/samba/private/ /Backups/Inc/$date/Fileserver/

  #Backup MongoDB
  ssh user@IP /usr/bin/mongodump --out /home/DB
  rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
  ssh user@IP rm -rf /home/DB
  fi
}

if [ "$mode" == "full" ]
then
  FullBackup;
elif [ "$mode" == "inc" ]
then
  IncrementalBackup;
fi

我使用的命令:完全备份bash script.sh -m full

增量bash script.sh -m inc -p full

执行脚本根本不会产生任何错误。正如我上面提到的,它似乎还在复制所有的文件。这是我做过的一些测试。

du -chs输出

代码语言:javascript
复制
root@Backup:/Backups# du -chs /Backups/Full/2021-11-20/*
36K     /Backups/Full/2021-11-20/DB
6.5M    /Backups/Full/2021-11-20/Fileserver
696K    /Backups/Full/2021-11-20/Web
7.2M    total
root@Backup:/Backups# du -chs /Backups/Inc/2021-11-20/*
36K     /Backups/Inc/2021-11-20/DB
6.5M    /Backups/Inc/2021-11-20/Fileserver
696K    /Backups/Inc/2021-11-20/Web
7.2M    total

ls -li输出

代码语言:javascript
复制
root@Backup:/Backups# ls -li /Backups/Full/2021-11-20/
total 12
1290476 drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
1290445 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290246 drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web
root@Backup:/Backups# ls -li /Backups/Inc/2021-11-20/
total 12
1290506 drwxr-xr-x 4 root root 4096 Nov 20 19:28 DB
1290496 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290486 drwxr-xr-x 4 root root 4096 Nov 20 19:28 Web

执行增量备份和更改/添加文件时的Rsync输出

代码语言:javascript
复制
receiving incremental file list
./
lol.html

sent 53 bytes  received 194 bytes  164.67 bytes/sec
total size is 606  speedup is 2.45
receiving incremental file list
./

sent 33 bytes  received 5,468 bytes  11,002.00 bytes/sec
total size is 93,851  speedup is 17.06
receiving incremental file list
./

sent 36 bytes  received 1,105 bytes  760.67 bytes/sec
total size is 6,688,227  speedup is 5,861.72
*Irrelevant MongoDB Dump Text*

sent 146 bytes  received 2,671 bytes  1,878.00 bytes/sec
total size is 2,163  speedup is 0.77

我怀疑./与此有关。我可能错了,但看起来很可疑。尽管当再次执行相同的命令时,./不在日志中,可能是因为我在同一天执行了该命令,因此它在/Backup/Inc/2021-11-20文件夹中被覆盖。

ls -l输出

代码语言:javascript
复制
root@Backup:/Backups# ls -l /Backups/Inc/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:49 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:49 Web
root@Backup:/Backups# ls -l /Backups/Full/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web

编辑注释:

代码语言:javascript
复制
root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Full/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 19:49:31.701680076 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:17.586745740 +0000 ..
-rw-r--r-- 2 root root  158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root   34 2021-11-20 19:49:31.701680076 +0000 lol.html
-rw-r--r-- 2 root root  414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css
root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Inc/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 23:16:47.673977833 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:54.903294115 +0000 ..
-rw-r--r-- 2 root root  158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root   44 2021-11-20 23:16:47.673977833 +0000 lol.html
-rw-r--r-- 2 root root  414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css

想了解更多信息,请告诉我。我已经尝试了很长时间了。也许我是完全错误的,有链接和节省磁盘空间。

EN

回答 1

Unix & Linux用户

发布于 2021-11-21 08:38:59

之所以会出现混乱,是因为文件系统中的两个位置都存在链接文件。当您使用du查看已使用的磁盘时,文件位于两棵树中,因此每次调用du都会找到所有文件。您已经将顶级结果加在一起,并得出结论,这些文件占用的空间是您希望的两倍,即硬链接没有起作用。

错误是将顶级磁盘使用结果加在一起。相反,尝试运行覆盖两个备份树的单个du。您会发现,您开始看到磁盘节省,因为du只对一个文件进行一次计数,而不考虑找到它的次数。

下面是一个有用的示例:

代码语言:javascript
复制
mkdir /tmp/a                       # Working directories
cp -a /etc/* /tmp/a 2>/dev/null    # Generate some data in /tmp/a
cp -al /tmp/a /tmp/b               # Link it into /tmp/b

现在,让我们来测量每棵树中使用的磁盘数量。应该是一样的,因为所有的文件都是链接的。(您可以使用ls -l验证这一点,查看所有文件的链接计数。)

代码语言:javascript
复制
du -ms /tmp/a                      # Disk usage summary
8       /tmp/a                     # Result

du -ms /tmp/b                      # Disk usage summary
8       /tmp/b                     # Result

请注意,在这里,这两种目录树似乎都在使用大约8MB。现在我们一起来看看这两棵树:

代码语言:javascript
复制
du -ms /tmp/a /tmp/b               # Disk usage summaries
8       /tmp/a
1       /tmp/b

您可以看到,/tmp/a仍然使用大约8MB,但是/tmp/b现在不再使用8MB,而是只使用额外的1MB。这是因为其他文件已经被计算,所以它们不会占用任何额外的磁盘空间。(目录结构占用额外的部分。)

使用更大的数据集,比率会变得更好;下面是从我使用rsnapshot的一个较小的系统中获取的备份片段,显示在30 GB左右的备份中,在这些备份之间的24小时内更改的不足1GB:

代码语言:javascript
复制
du -ms daily.{0,1}
30752   daily.0
782     daily.1
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/678432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档