使用 systemd timer + rsync 实现 Linux 服务器自动增量备份
服务器最怕的不是宕机,而是数据丢了才发现没有备份。本文介绍一套零成本、低维护的方案:用 rsync 做增量同步,用 systemd timer 替代 cron 做定时调度,每天凌晨自动备份网站数据和数据库,保留 7 天滚动快照。
为什么选 rsync + systemd timer
rsync 只传输变化的部分,第一次全量、之后每次都是增量,带宽和磁盘占用都很小;配合 --link-dest 还能实现硬链接快照,每天的备份看起来是一份完整目录,实际只多占变化文件的空间。
systemd timer 相比 cron 有几个实在的好处:执行失败有日志可查(journalctl -u),错过执行时间可以补跑(Persistent=true),时间表达式更灵活,而且服务和定时器分离,配置更清晰。
准备工作
假设数据在 /srv/www,备份目标是挂载在 /mnt/backup 的独立磁盘或对象存储挂载点。先确认 rsync 已安装:
rsync --version
systemctl --version
备份目录按日期组织:/mnt/backup/daily/2026-11-08 这种形式,每天一个目录,配合硬链接快照。
备份脚本
写一个备份脚本 /usr/local/bin/backup-daily.sh,核心就三行:
#!/bin/bash
set -euo pipefail
SRC="/srv/www"
DST="/mnt/backup/daily/$(date +%F)"
LATEST="/mnt/backup/daily/latest"
mkdir -p "$(dirname "$DST")"
rsync -a --delete --link-dest="$LATEST" "$SRC/" "$DST/"
ln -sfn "$DST" "$LATEST"
参数说明:-a 是归档模式,保留权限、时间戳和符号链接;--delete 删除目标端多余文件,保持与源一致;--link-dest 指向上一份备份,未变化的文件用硬链接复用,不额外占空间。
数据库也要备份。在 rsync 之前先导出一份逻辑备份,例如:
mysqldump -u root --single-transaction --all-databases > /srv/www/db.sql
把数据库导出文件放进源目录一起同步,恢复时就只需要一份快照。
systemd service 与 timer
新建服务单元 /etc/systemd/system/backup-daily.service:
[Unit]
Description=Daily incremental backup with rsync
After=network.target local-fs.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-daily.sh
再建定时器单元 /etc/systemd/system/backup-daily.timer:
[Unit]
Description=Run daily backup at 03:30
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
Unit=backup-daily.service
[Install]
WantedBy=timers.target
Persistent=true 很关键:如果服务器在凌晨 3:30 正好关机,启动后 timer 会立刻补跑一次,不会悄悄漏掉一天。
启用并验证:
systemctl daemon-reload
systemctl enable --now backup-daily.timer
systemctl list-timers backup-daily.timer
systemctl start backup-daily.service
journalctl -u backup-daily.service -n 50
看到备份目录生成、日志无报错,就算跑通了。
保留策略与清理
每天一份快照,磁盘总会满。加一个清理规则,只保留最近 7 天:
find /mnt/backup/daily -maxdepth 1 -type d -mtime +7 ! -name latest -exec rm -rf {} +
注意 latest 是符号链接,不要误删;用 -type d 限定只删目录。清理命令可以放在备份脚本末尾,也可以单独做一个 weekly timer。
恢复演练
备份没有演练过就等于没有备份。每月至少做一次恢复演练:
rsync -a /mnt/backup/daily/2026-11-08/ /tmp/restore-test/
diff -r /srv/www /tmp/restore-test | head -20
确认文件数量、关键配置文件和数据库导出都能对上,再删掉演练目录。演练花十分钟,关键时刻能省一整天。
注意事项
- 备份盘和源数据不要放在同一块物理磁盘上,否则磁盘故障会一起丢;有条件优先备份到异地对象存储。
- 备份脚本里不要写明文密码,数据库账号建议用
.my.cnf或环境变量传入。 - 备份前先测一次手动执行,确认
--delete的方向正确,方向反了会删源数据。 - 关注备份时长:如果单次备份超过 24 小时,说明增量策略或网络需要优化。
- 把
systemctl list-timers的输出纳入日常巡检,timer 被意外停用是最常见的漏备份原因。
总结
rsync 负责高效增量同步,systemd timer 负责可靠定时调度,二者都是系统自带工具,不用引入额外组件。每天凌晨自动备份、保留 7 天滚动快照、每月一次恢复演练,这套流程跑起来后,数据安全就从“记得备份”变成了“系统默认”。
- 点赞
- 收藏
- 关注作者
评论(0)