rsync 增量备份仍然复制所有文件
Rsync Incremental Backup still copies all the files
我目前正在为 rsync 编写 bash 脚本。我很确定我做错了什么。但我不知道那是什么。我会尽力详细说明所有内容,希望有人能帮助我。
脚本的目标是使用 rsync 进行完整备份和增量备份。除了一件至关重要的事情外,一切似乎都运行良好。似乎即使使用 --link-dest
参数,它仍然会复制所有文件。我用 du -chs
.
检查了文件大小
首先是我的脚本:
#!/bin/sh
while getopts m:p: flags
do
case "$flags" in
m) mode=${OPTARG};;
p) prev=${OPTARG};;
*) echo "usage: [=10=] [-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 的输出
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 的输出
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
做增量备份和changing/adding一个文件时的rsync输出
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
文件夹中。
让我知道更多信息。我已经尝试了很长时间了。也许我完全错了,已经建立了链接并节省了磁盘 space。
我没有阅读整个代码,因为主要问题似乎不在那里。
使用 du -sh /Backups
验证 /Backups
目录的磁盘使用情况,然后将其与 du -sh /Backups/Full
和 du -sh /Backups/Inc
.
的总和进行比较
我会通过一些小测试告诉你原因:
创建一个包含 1 MiB 文件的目录:
mkdir -p /tmp/example/data
dd if=/dev/zero of=/tmp/example/data/zerofile bs=1M count=1
进行“完整”备份:
rsync -av /tmp/example/data/ /tmp/example/full
进行“增量”备份
rsync -av --link-dest=/tmp/example/full /tmp/example/data/ /tmp/example/incr
现在让我们看看我们得到了什么:
和ls -l
ls -l /tmp/example/*
-rw-rw-r-- 1 user group 1048576 Nov 21 00:24 /tmp/example/data/zerofile
-rw-rw-r-- 2 user group 1048576 Nov 21 00:24 /tmp/example/full/zerofile
-rw-rw-r-- 2 user group 1048576 Nov 21 00:24 /tmp/example/incr/zerofile
和 du -sh
du -sh /tmp/example/*
1.0M /tmp/example/data
1.0M /tmp/example/full
0 /tmp/example/incr
- 哦?
/tmp/example/incr
中有一个 1 MiB 的文件,但 du
错过了它?
实际上没有。由于文件自上次备份后未被修改(引用 --link-dest
),rsync
为其创建了一个 hard-link 而不是复制它的内容。 — Hard-links 将相同的内存space连接到不同的文件
并且 du
可以检测硬 link 并向您显示真实的磁盘使用情况,但是 仅当包含硬 link 文件时(即使在子目录中) ) 在其参数中 。例如,如果您对 /tmp/example/incr
:
独立使用 du -sh
du -sh /tmp/example/incr
1.0M /tmp/example/incr
- 如何检测文件是否存在硬 link?
ls -l
居然给我们看了:
-rw-rw-r-- 2 user group 1048576 Nov 21 00:24 /tmp/example/full/zerofile
^
HERE
这个数字意味着文件有两个现有的硬link:这个文件本身和同一文件系统中的另一个。
关于您的代码
它没有改变任何东西,但我会替换:
#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/
与:
#Get Latest Folder
glob='20[0-9][0-9]-[0-1][0-9]-[0-3][0-9]' # match a timestamp (more or less)
NewestBackup=$(compgen -G "/Backups/$Method/$glob/" | sort -nr | head -n 1)
glob
确保 compgen -G
找到的 directories/files 具有正确的格式。
- 在 glob 的末尾添加
/
确保它只匹配目录。
我目前正在为 rsync 编写 bash 脚本。我很确定我做错了什么。但我不知道那是什么。我会尽力详细说明所有内容,希望有人能帮助我。
脚本的目标是使用 rsync 进行完整备份和增量备份。除了一件至关重要的事情外,一切似乎都运行良好。似乎即使使用 --link-dest
参数,它仍然会复制所有文件。我用 du -chs
.
首先是我的脚本:
#!/bin/sh
while getopts m:p: flags
do
case "$flags" in
m) mode=${OPTARG};;
p) prev=${OPTARG};;
*) echo "usage: [=10=] [-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 的输出
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 的输出
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
做增量备份和changing/adding一个文件时的rsync输出
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
文件夹中。
让我知道更多信息。我已经尝试了很长时间了。也许我完全错了,已经建立了链接并节省了磁盘 space。
我没有阅读整个代码,因为主要问题似乎不在那里。
使用 du -sh /Backups
验证 /Backups
目录的磁盘使用情况,然后将其与 du -sh /Backups/Full
和 du -sh /Backups/Inc
.
我会通过一些小测试告诉你原因:
创建一个包含 1 MiB 文件的目录:
mkdir -p /tmp/example/data
dd if=/dev/zero of=/tmp/example/data/zerofile bs=1M count=1
进行“完整”备份:
rsync -av /tmp/example/data/ /tmp/example/full
进行“增量”备份
rsync -av --link-dest=/tmp/example/full /tmp/example/data/ /tmp/example/incr
现在让我们看看我们得到了什么:
和ls -l
ls -l /tmp/example/*
-rw-rw-r-- 1 user group 1048576 Nov 21 00:24 /tmp/example/data/zerofile
-rw-rw-r-- 2 user group 1048576 Nov 21 00:24 /tmp/example/full/zerofile
-rw-rw-r-- 2 user group 1048576 Nov 21 00:24 /tmp/example/incr/zerofile
和 du -sh
du -sh /tmp/example/*
1.0M /tmp/example/data
1.0M /tmp/example/full
0 /tmp/example/incr
- 哦?
/tmp/example/incr
中有一个 1 MiB 的文件,但du
错过了它?
实际上没有。由于文件自上次备份后未被修改(引用 --link-dest
),rsync
为其创建了一个 hard-link 而不是复制它的内容。 — Hard-links 将相同的内存space连接到不同的文件
并且 du
可以检测硬 link 并向您显示真实的磁盘使用情况,但是 仅当包含硬 link 文件时(即使在子目录中) ) 在其参数中 。例如,如果您对 /tmp/example/incr
:
du -sh
du -sh /tmp/example/incr
1.0M /tmp/example/incr
- 如何检测文件是否存在硬 link?
ls -l
居然给我们看了:
-rw-rw-r-- 2 user group 1048576 Nov 21 00:24 /tmp/example/full/zerofile
^
HERE
这个数字意味着文件有两个现有的硬link:这个文件本身和同一文件系统中的另一个。
关于您的代码
它没有改变任何东西,但我会替换:
#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/
与:
#Get Latest Folder
glob='20[0-9][0-9]-[0-1][0-9]-[0-3][0-9]' # match a timestamp (more or less)
NewestBackup=$(compgen -G "/Backups/$Method/$glob/" | sort -nr | head -n 1)
glob
确保compgen -G
找到的 directories/files 具有正确的格式。- 在 glob 的末尾添加
/
确保它只匹配目录。