作为Linux运维者,备份是日常工作中不可或缺的一环——无论是服务器配置文件、用户数据,还是项目代码,一旦丢失都可能造成不可挽回的损失。但很多人在备份时都会陷入一个困境:全量备份占用空间大、耗时久,每天执行一次不仅浪费磁盘资源,还会影响服务器性能;而手动筛选差异文件备份,又容易遗漏、出错。
今天就给大家分享一个Linux下最常用、最高效的增量备份方案——用 rsync 实现差异备份。它既能解决全量备份的痛点,又能保证备份的完整性和高效性,无论是新手还是资深运维,都能快速上手,看完就能直接套用在实际工作中。
一、先搞懂:全量备份 vs 增量备份
在开始实操前,我们先明确两个核心概念,避免混淆。简单来说,全量备份和增量备份的区别,就像“复制整个文件夹”和“只复制新增/修改的文件”。
| | | | |
|---|
| | | | |
| | | | 每日备份、数据量大(如日志、用户数据)、频繁更新的场景 |
实用建议:生产环境中,推荐采用「全量备份+增量备份」结合的方式——每周日执行1次全量备份,周一至周六执行增量备份,既节省空间,又能保证数据可恢复。
二、rsync 核心讲解:为什么它是增量备份首选?
rsync(remote sync)是Linux系统自带的一款高效备份工具,核心优势是「差异同步」——它会对比源目录和目标目录的文件,只传输差异部分,而非整个文件,这也是它实现增量备份的核心原理。关键提醒:rsync 增量备份本质不是“差异备份文件”,而是“硬链接快照体系”,每一次增量备份都会生成一个可独立恢复的完整快照,通过硬链接复用全量备份的相同文件,从而节省磁盘空间。
与其他备份工具(如cp、scp)相比,rsync还有这些优势:
- 跨平台支持:可在Linux、Windows、macOS之间同步
- 支持本地/远程备份:既可以备份本地文件,也能备份远程服务器文件
2.1 先确认rsync是否安装
大部分Linux系统(CentOS、Ubuntu)默认已安装rsync,可通过以下命令验证:
# 查看rsync版本rsync --version# 若未安装,执行以下命令安装# CentOS/RHELyum install -y rsync# Ubuntu/Debianapt update && apt install -y rsync
2.2 rsync 核心参数详解
rsync的参数很多,但增量备份常用的就几个,记住这些就能应对80%的场景,每个参数搭配实例说明,新手也能看懂。
| | |
|---|
| 最常用参数,等同于 -rlptgoD,保留文件权限、所有者、时间戳等,适合备份;注意:该参数不包含 ACL / xattr 权限,若需保留这两类权限,需额外添加 -A -X 参数。 | |
| 显示备份过程中的详细信息(如传输的文件、大小),便于排查问题 | rsync -av /source /backup |
| 传输时压缩文件,减少网络带宽占用(远程备份必用,本地备份可选) | rsync -avz /source user@remote:/backup |
| 同步时,删除目标目录中存在、但源目录中不存在的文件(保持目标与源一致) | rsync -av --delete /source /backup |
| | rsync -av --exclude=*.log /source /backup |
| 增量备份核心参数,基于指定的全量备份目录,只备份差异文件(硬链接) | rsync -av --link-dest=/full_backup /source /inc_backup |
| 等同于 --partial --progress,支持断点续传,显示传输进度 | rsync -avP /source /backup |
注意:--delete 参数慎用!如果源目录误删了文件,同步时会删除目标目录的对应文件,建议搭配 --delete-delay(延迟删除,便于回滚)和 --delete-excluded(同步排除规则)使用,降低误删风险;备份时建议先测试,或结合定时任务+日志确认。
三、实操:本地增量备份脚本编写(可直接复制使用)
下面我们编写一个生产级的本地增量备份脚本,实现「全量备份+增量备份」结合,包含日志记录、异常处理、自动清理过期备份,新手只需修改配置项即可使用。
3.1 脚本需求梳理
- 备份存储:/backup(备份文件存放目录,可修改)
- 备份策略:每周日凌晨2点执行全量备份,其余时间执行增量备份
3.2 完整备份脚本
#!/bin/bash########################################################### Linux rsync 本地增量备份脚本(生产级)# 功能:全量备份(每周日)+ 增量备份(其余时间)、日志记录、过期清理# 核心参数:--link-dest 实现增量备份,硬链接节省空间# 核心原理:rsync 增量备份本质不是“差异备份文件”,而是“硬链接快照体系”########################################################### ===================== 配置项(新手必改)=====================SOURCE_DIR="/data"# 要备份的源目录(必填)BACKUP_DIR="/backup"# 备份文件存放目录(必填)RETENTION_DAYS=30 # 备份保留天数(默认30天)LOG_FILE="${BACKUP_DIR}/rsync_backup.log"# 日志文件路径# ===========================================================# 变量初始化DATE=$(date +%Y%m%d_%H%M%S)WEEKDAY=$(date +%w) # 获取当前星期(0=周日,1=周一,...,6=周六)FULL_BACKUP_DIR="${BACKUP_DIR}/full_${DATE}"# 全量备份目录# 增量备份目录(基于最近一次全量备份,按时间排序确保一致性)LAST_FULL_BACKUP=$(find ${BACKUP_DIR} -maxdepth 1 -type d -name "full_*" | sort | tail -1)INC_BACKUP_DIR="${BACKUP_DIR}/inc_${DATE}"# 初始化目录与日志文件(避免日志写入失败)mkdir -p ${BACKUP_DIR}touch ${LOG_FILE}# 日志函数(输出时间+内容,写入日志文件)log() {echo"[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a ${LOG_FILE}}log"==================== rsync 备份开始 ===================="# 1. 每周日执行全量备份if [ ${WEEKDAY} -eq 0 ]; thenlog"当前为周日,执行全量备份"# --delete-delay 延迟删除,降低误删风险;--delete-excluded 同步排除规则到目标目录 rsync -av --delete-delay --delete-excluded --exclude="tmp/" --exclude="logs/"${SOURCE_DIR}/ ${FULL_BACKUP_DIR}/# 备份结果校验if [ $? -eq 0 ]; thenlog"✅ 全量备份成功,备份目录:${FULL_BACKUP_DIR}"elselog"❌ 全量备份失败,请检查源目录和权限"exit 1fi# 2. 其余时间执行增量备份(基于最近一次全量备份)else# 检查是否存在全量备份,无全量备份则执行全量备份if [ -z "${LAST_FULL_BACKUP}" ]; thenlog"未找到全量备份,自动执行全量备份" rsync -av --delete-delay --delete-excluded --exclude="tmp/" --exclude="logs/"${SOURCE_DIR}/ ${FULL_BACKUP_DIR}/if [ $? -eq 0 ]; thenlog"✅ 全量备份成功(自动触发),备份目录:${FULL_BACKUP_DIR}"elselog"❌ 全量备份失败,请检查源目录和权限"exit 1fielselog"执行增量备份,基于全量备份:${LAST_FULL_BACKUP}"# --link-dest 指向最近一次全量快照(绝对路径),确保硬链接正确 rsync -av --delete-delay --delete-excluded --link-dest=${LAST_FULL_BACKUP} --exclude="tmp/" --exclude="logs/"${SOURCE_DIR}/ ${INC_BACKUP_DIR}/if [ $? -eq 0 ]; thenlog"✅ 增量备份成功,备份目录:${INC_BACKUP_DIR}"log"💡 提示:该增量备份目录为完整快照,可直接独立恢复,无需叠加全量备份"elselog"❌ 增量备份失败,请检查全量备份目录和权限"exit 1fififi# 3. 清理过期备份(安全写法,避免误删)log"清理${RETENTION_DAYS}天前的过期备份..."find ${BACKUP_DIR} -maxdepth 1 -type d -name "full_*" -mtime +${RETENTION_DAYS} -print0 | xargs -0 rm -rffind ${BACKUP_DIR} -maxdepth 1 -type d -name "inc_*" -mtime +${RETENTION_DAYS} -print0 | xargs -0 rm -rflog"✅ 过期备份清理完成"log"==================== rsync 备份结束 ===================="exit 0
3.3 脚本使用步骤
# 1. 创建脚本文件(路径可自定义)vim /usr/local/scripts/rsync_backup.sh# 2. 粘贴上面的脚本,修改【配置项】中的 SOURCE_DIR 和 BACKUP_DIR# 重点:确保源目录存在,备份目录有写入权限# 3. 给脚本添加可执行权限chmod +x /usr/local/scripts/rsync_backup.sh# 4. 手动测试执行(首次执行会自动触发全量备份)/usr/local/scripts/rsync_backup.sh# 5. 查看备份结果和日志ls /backup # 查看备份目录cat /backup/rsync_backup.log # 查看备份日志,确认是否成功
3.4 配置定时任务(自动执行备份)
脚本编写完成后,配置crontab定时任务,实现每日自动备份:
# 编辑定时任务crontab -e# 添加定时任务(每日凌晨2点执行)0 2 * * * /usr/local/scripts/rsync_backup.sh# 查看定时任务是否添加成功crontab -l
四、关键技巧:排除不需要备份的文件/目录
备份时,有些文件/目录是不需要备份的(如临时文件、日志文件、缓存目录),如果一起备份会浪费空间,rsync提供了多种排除方式,按需选择即可。
4.1 常用排除方式(3种)
单文件/目录排除(--exclude):适合排除少量文件/目录,支持通配符。注意:rsync exclude 不基于绝对路径匹配,无需写完整绝对路径,避免匹配失效。
# 排除单个文件 rsync -av --exclude=test.txt /source /backup # 排除单个目录(正确写法,无需绝对路径) rsync -av --exclude="logs/" /source /backup # 排除指定后缀的文件(如.log、.tmp) rsync -av --exclude=*.log --exclude=*.tmp /source /backup
多文件/目录排除(--exclude-from):适合排除大量文件/目录,将需要排除的内容写入文件,批量排除。注意:排除路径无需写绝对路径。
# 1. 创建排除文件,写入需要排除的内容(无需绝对路径)vim /usr/local/scripts/exclude_list.txt# 写入以下内容(每行一个文件/目录,支持通配符)*.log *.tmp logs/ cache/ tmp/#2. 执行备份时引用排除文件rsync -av --exclude-from=/usr/local/scripts/exclude_list.txt /source /backup
排除隐藏文件(--exclude=.*):适合不需要备份隐藏文件(如.git、.bashrc)的场景。
rsync -av --exclude=.* /source /backup
实用技巧:排除目录时,建议写绝对路径(如 /data/logs),避免因相对路径导致排除失效;如果不确定排除是否生效,可先加上 -n 参数(模拟备份,不实际传输)测试。
五、增量备份恢复方法
增量备份的恢复需要结合「全量备份+所有增量备份」,步骤比全量备份稍复杂,但只要按顺序操作,就能快速恢复数据。⚠️ 重要警告:rsync 增量备份不需要逐级恢复,每个备份目录(full_* 或 inc_*)都是完整快照,可直接独立恢复,无需叠加全量备份。以下是两种常见的恢复场景。
5.1 场景1:恢复到最新状态(全量+所有增量)
假设我们的备份目录如下,需要恢复到最新的增量备份状态:
/backup/├── full_20260413_020000 # 全量备份(周日)├── inc_20260414_020000 # 周一增量备份├── inc_20260415_020000 # 周二增量备份└── rsync_backup.log
恢复步骤(无需叠加全量,直接恢复最新增量快照即可):
# 1. 创建恢复目录(避免覆盖源目录,建议先测试)mkdir -p /data_restore# 2. 直接恢复最新的增量备份(无需恢复全量,增量目录本身就是完整快照)rsync -av ${BACKUP_DIR}/inc_20260415_020000/ /data_restore/# 补充:若需恢复到全量备份状态,直接恢复全量目录即可# rsync -av ${BACKUP_DIR}/full_20260413_020000/ /data_restore/# 3. 恢复完成后,检查恢复目录的文件是否完整ls /data_restore
5.2 场景2:恢复单个文件(无需恢复全部)
如果只是误删了某个文件,不需要恢复整个目录,直接从最近的备份中提取即可:
# 示例:恢复 /data/test.txt 文件,从最新的增量备份中提取rsync -av ${BACKUP_DIR}/inc_20260415_020000/test.txt /data/# 若增量备份中没有该文件,从全量备份中提取rsync -av ${BACKUP_DIR}/full_20260413_020000/test.txt /data/
注意:恢复时,建议先将文件恢复到临时目录,确认无误后再覆盖源文件,避免误操作导致数据二次丢失。
六、常见问题与避坑指南
- 问题1:rsync备份失败,提示“permission denied”(权限不足) 原因:执行脚本的用户(如root)没有源目录的读取权限,或备份目录的写入权限。解决:给源目录添加读取权限,备份目录添加写入权限,或用root用户执行脚本。
- 问题2:增量备份占用空间和全量一样大,没有实现差异备份原因:未使用 --link-dest 参数,或 --link-dest 指定的全量备份目录路径错误、未按时间顺序获取全量目录。解决:检查脚本中 --link-dest 的路径,确保使用绝对路径,且通过 find + sort 按时间排序获取最近一次全量备份目录(脚本已优化)。
- 问题3:--delete 参数导致目标目录文件被误删原因:源目录误删了文件,同步时rsync会删除目标目录的对应文件,尤其未搭配保护参数时风险更高。解决:非必要不使用 --delete 参数;若必须使用,建议搭配 --delete-delay(延迟删除,便于回滚)和 --delete-excluded(同步排除规则),同时先执行模拟备份(加 -n 参数),确认无误后再执行真实备份。
- 问题4:备份日志为空,或脚本执行无反应原因:脚本没有可执行权限、配置项中的目录路径错误,或日志目录未创建导致日志写入失败。解决:给脚本添加可执行权限(chmod +x 脚本路径),检查 SOURCE_DIR 和 BACKUP_DIR 是否存在;脚本已优化,会自动创建备份目录和日志文件,避免日志写入失败。
如果你觉得本文对你有帮助,欢迎点赞、推荐、转发,关注我,后续会分享更多Linux入门干货!
文 / 零距技术仓记录每一次真实的折腾 (#^.^#)🚀 想看到更多实用折腾技巧?👉 先关注💬 评论区说说你的经历或想看的内容👍 点赞表示支持🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎