服务器文件同步增量备份如何搭建

chinaz
chinaz 初级会员超兽战士
发布于 2026-10-08 04:14 ·1 浏览 ·0 回复

学完这篇,你能在自己的 Linux 服务器上用 rsync 搭出一套「每天一个快照、只传变化部分、磁盘占用接近一份全量」的增量备份方案,并知道怎么定时跑、怎么验证、怎么恢复。下面以 Ubuntu 22.04(rsync 3.2.7)为例,全程用命令行操作。

第一步:装好 rsync 并确认版本

这一步要让本机和服务器都具备 rsync 命令,并确认版本不低于 3.0(--link-dest 硬链接快照需要它)。

在备份机和被备份机上分别执行:

sudo apt update
sudo apt install -y rsync
rsync --version | head -n 1

看到 rsync version 3.2.7 protocol version 31 之类的输出即可。CentOS/Rocky 用 sudo dnf install -y rsync。

注意:如果服务器是极简系统,可能默认带的是 rsync 2.x,--link-dest 行为不同,先升级再往下做。

第二步:配置 SSH 免密登录

这一步让备份机不用输密码就能连上被备份机,备份脚本才能放进定时任务自动跑。

在备份机上执行(一路回车,passphrase 留空):

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
ssh-copy-id -p 22 root@192.168.1.10
ssh -p 22 root@192.168.1.10 "hostname"

最后一条能直接打印出对端主机名,就说明免密成功。不是 22 端口就把 -p 换成实际端口。

注意:备份一般要读对端所有文件,通常用 root 或带 sudo 的专用账号;普通账号会因权限不足静默跳过文件,备份结果不完整。

第三步:准备备份目录结构

这一步在备份机上建立「一份份带日期目录 + 一个 latest 指针」的目录骨架,后面每次备份都往里加一天。

sudo mkdir -p /backup/daily
sudo mount /dev/sdb1 /backup     # 备份盘单独挂载,别和数据盘混用
df -h /backup

结构约定:/backup/daily/2024-06-01/、/backup/daily/2024-06-02/……以及软链接 /backup/daily/latest 指向最新一天。

注意:硬链接不能跨文件系统,/backup 必须是独立挂载点,否则快照间无法共享数据块,磁盘会被撑满。

第四步:写备份脚本

这一步写出核心脚本,用 --link-dest 让没变化的文件硬链接到上一天,只有改动过的文件才真正占新空间。

新建 /usr/local/bin/backup.sh:

#!/bin/bash
set -euo pipefail
SRC="/data/"
DEST="/backup/daily"
TODAY=$(date +%F)
mkdir -p "$DEST/$TODAY"
LINK=""
if [ -L "$DEST/latest" ]; then
  LINK="--link-dest=$(readlink -f "$DEST/latest")"
fi
rsync -aAX --delete --numeric-ids $LINK \
  -e "ssh -p 22" \
  root@192.168.1.10:"$SRC" "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"

find "$DEST" -maxdepth 1 -type d -mtime +30 ! -name daily -exec rm -rf {} \;

参数含义:-a 归档模式,-A 保留 ACL,-X 保留扩展属性,--delete 让目标与源一致,--numeric-ids 避免 UID 映射错乱,--link-dest 指向上一次快照。

赋权并手动跑一次:

sudo chmod +x /usr/local/bin/backup.sh
sudo /usr/local/bin/backup.sh

注意:--delete 会删除目标端多余文件,务必先确认 SRC 路径结尾的斜杠含义——/data/ 是同步目录内容,/data 会多套一层目录。

第五步:设置定时任务

这一步让脚本每天凌晨自动执行,得到持续的增量备份链。

执行 sudo crontab -e,加入一行:

0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

保存后 sudo tail -f /var/log/backup.log 观察下一次执行结果。想用 systemd 的话,建 backup.service + backup.timer,OnCalendar=daily 即可。

第六步:验证与恢复演练

这一步确认快照真的共享了数据块、并且能还原,避免「备份了但用不了」。

du -sh /backup/daily/*          # 后续日期应远小于第一天
ls -li /backup/daily/2024-06-01/etc/hosts /backup/daily/latest/etc/hosts
rsync -avn --delete /backup/daily/latest/ /tmp/restore-test/

两条 ls -li 的 inode 号相同,说明是硬链接;-n 是干跑,确认无误后去掉 -n 真正恢复。

注意:find ... -exec rm -rf 的保留策略一定要加 ! -name daily 之类的保护,写错一个变量就可能把整个 /backup/daily 删空。定期做一次真实恢复演练,比看日志有用。

小结

  • 核心是 rsync -aAX --delete --link-dest=上一次快照,硬链接共享未变文件,实现增量的空间占用、全量的可读性。
  • /backup 必须独立挂载,否则硬链接失效。
  • SSH 免密 + cron 让它自动跑,日志重定向到文件方便排查。
  • 保留策略要保护 latest 和日期目录,删除条件写保守些。
  • 备份没做过恢复演练就不算完成,定期用 rsync -avn 干跑校验。
版权声明:本文来自 GJ站长论坛《服务器文件同步增量备份如何搭建》
原文链接:https://www.gj0.com/thread-734.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~