Linux 服务器定时备份:rsync + systemd 定时器做增量备份
服务器数据丢了才想起备份,就已经晚了。不少同学用 cron 加 rsync 拼脚本,时间一长就会遇到:任务没跑没人知道、失败静默、备份目录越占越大、恢复时找不到对应版本。本文用 rsync 的硬链接增量备份加 systemd 定时器,搭一套每天自动跑、失败能发现、恢复能定位的备份方案,适合单台 Linux 服务器备份网站数据和配置文件。
一、增量备份的核心
rsync 本身只传变化的部分,但如果每次都覆盖同一个目录,历史版本就丢了。给 rsync 加上链接目标参数,指向上一份备份:没有变化的文件直接硬链接,不占额外空间;变化的文件才真正复制一份。这样每天一份完整目录快照,磁盘占用却接近增量。
两个细节最容易出错:一是源目录末尾的斜杠决定语义,斜杠结尾备份的是目录内容,不带斜杠备份的是目录本身,写错一次就可能多套一层目录;二是删除参数会删除目标端多余的文件,第一次用务必先加演练参数确认输出无误再真正执行。
二、备份脚本
#!/bin/bash
set -euo pipefail
SRC="/data/"
DST="/backup"
DATE=$(date +%Y-%m-%d)
LATEST=$(ls -d ${DST}/20* 2>/dev/null | tail -1)
mkdir -p "${DST}/${DATE}"
rsync -a --delete --link-dest="${LATEST}" "${SRC}" "${DST}/${DATE}/"
ln -sfn "${DST}/${DATE}" "${DST}/latest"
find "${DST}" -maxdepth 1 -type d -name "20*" -mtime +30 -exec rm -rf {} +
logger "backup done: ${DATE}"
脚本里用严格模式让任何一步失败就立即退出,避免静默跑出半份备份;latest 软链接永远指向最新快照,恢复时不用翻日期;保留 30 天的快照由 find 自动清理,不靠人工删。
三、用 systemd 定时器代替 cron
cron 的短板是失败不可见、没有日志聚合、机器重启后错过的任务不会补跑。写两个单元文件就能解决:服务单元只跑一次,启动命令指向备份脚本;定时器单元每天凌晨两点半触发,并设置重启后补跑错过的任务。
启用后用查看定时器列表的命令看下次触发时间,用查看服务日志的命令看上次执行日志。定时器时间要避开业务高峰和数据库备份窗口,凌晨两点半通常比较合适。
四、恢复与演练
备份的价值在恢复时才兑现。每月做一次恢复演练:把某天快照同步回临时目录,核对关键文件能正常打开;只备份文件还不够,数据库要先导出备份文件落盘,再随文件一起备份;备份目录本身也要异地存一份,同一块盘上的备份防不住磁盘故障。
五、容易踩的坑
第一,删除参数加源路径写错等于删光目标端,先演练再执行;第二,备份脚本和密钥权限要收紧,脚本设为仅所有者可读写执行;第三,保留策略写进脚本而不是靠人工记;第四,监控不能少,定时器失败时配置失败告警,至少每天检查一次服务日志。
结语
备份不是跑起来就行,而是失败有人知道、恢复有人练过。rsync 管增量、systemd 管调度与可观测性,两者组合足够撑起一台服务器的日常备份;数据量再大,再上对象存储或专业备份工具也不迟。
- 点赞
- 收藏
- 关注作者
评论(0)