17. 备份与恢复
本章介绍 RHEL 9 的数据备份与恢复体系:rsync 增量同步、tar 全量归档、LVM 快照一致性备份,以及 systemd timer 自动化调度。备份策略的真正价值在于能够成功恢复,因此本章同等重视备份操作与恢复验证演练。
备份三原则
① 定期备份:依据 RPO(恢复点目标)确定频率;② 异地存储:备份文件不能与源数据在同一磁盘上;③ 定期演练:未经测试的备份等于没有备份。
17.1 前提条件
- 已完成磁盘与存储管理配置(第 15 章),LVM 逻辑卷
/dev/datavg/datalv已挂载至/mnt/lvmdata。 - 通过 SecureCRT(SSH 端口 2222)以
ops用户、密钥认证方式登录192.168.1.100,执行sudo -i切换至 root 环境。 - 创建备份目标目录并设置权限:
mkdir -p /backup
chown ops:ops /backup
本章全局参数
| 参数 | 值 |
|---|---|
| 主机名 | linuxdc |
| IP | 192.168.1.100 |
| 备份目标目录 | /backup |
| 远程备份服务器 | 192.168.1.200(ops 用户,密钥认证) |
| LVM 卷路径 | /dev/datavg/datalv → /mnt/lvmdata |
17.2 rsync 增量备份
rsync 是 Linux 最常用的备份工具,支持增量传输(只同步变化部分),本地和远程均适用,是构建高效备份体系的核心工具。
17.2.1 本地增量备份
# 备份 /etc 到本地 /backup 目录(保留目录结构)
rsync -avh --delete \
/etc \
/backup/etc-$(date +%F)/
关键参数说明:
| 参数 | 含义 |
|---|---|
-a |
归档模式:保留权限、时间戳、软链接、所有者、设备文件 |
-v |
详细输出,显示传输的每个文件 |
-h |
人类可读大小(KB/MB/GB) |
--delete |
删除目标中源已不存在的文件,保持严格同步 |
-z |
传输时压缩(网络传输时节省带宽) |
--progress |
显示每个文件的传输进度 |
# 验证备份内容
ls -lh /backup/
du -sh /backup/etc-$(date +%F)/
17.2.2 远程 rsync 备份(SSH 传输)
# 前提:已配置 SSH 密钥免密登录到备份服务器(192.168.1.200)
# 本地推送到远程
rsync -avhz --delete \
/data/nfs_share/ \
ops@192.168.1.200:/backup/linuxdc/nfs_share/
# 从远程拉取(恢复场景)
rsync -avhz \
ops@192.168.1.200:/backup/linuxdc/ \
/restore/
17.2.3 rsync 排除规则
# 备份根文件系统,排除虚拟文件系统和临时目录
rsync -avh --delete \
--exclude='*.log' \
--exclude='*.tmp' \
--exclude='/proc/' \
--exclude='/sys/' \
--exclude='/dev/' \
--exclude='/run/' \
--exclude='/backup/' \
/ \
/backup/rootfs-$(date +%F)/
17.3 tar 全量归档备份
tar 将多个文件打包为单一归档文件,适合全量快照备份、离线存储和跨系统传输。
17.3.1 创建归档备份
# gzip 压缩归档(速度快,压缩率中等)
tar -czpf /backup/system-$(date +%F).tar.gz \
--exclude=/backup \
--exclude=/proc \
--exclude=/sys \
--exclude=/dev \
--exclude=/run \
/etc /home
# xz 压缩归档(压缩率高,速度慢,适合离线长期存储)
tar -cJpf /backup/system-$(date +%F).tar.xz /etc /home
归档参数说明:
| 参数 | 含义 |
|---|---|
-c |
创建归档 |
-z / -J |
gzip / xz 压缩 |
-p |
保留文件权限(需 root) |
-f |
指定输出文件名 |
--exclude |
排除指定路径 |
17.3.2 验证归档完整性
# 列出归档内容(不解压,验证可读性)
tar -tzvf /backup/system-$(date +%F).tar.gz | head -30
# 完整性测试(读取全部内容,检查是否损坏)
tar -tzvf /backup/system-$(date +%F).tar.gz > /dev/null
echo "退出码: $?" # 0 = 正常,非 0 = 损坏
检查点
完整性验证命令退出码为 0,说明归档文件完整,未发生数据损坏。
17.3.3 从 tar 归档恢复文件
# 从归档中恢复单个文件
mkdir -p /tmp/restore
tar -xzvf /backup/system-$(date +%F).tar.gz \
-C /tmp/restore \
etc/ssh/sshd_config
# 确认已提取(路径不含前导 /)
ls -l /tmp/restore/etc/ssh/sshd_config
# 恢复到原位(先备份当前版本)
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.broken
cp /tmp/restore/etc/ssh/sshd_config /etc/ssh/
# 恢复整个目录
tar -xzvf /backup/system-$(date +%F).tar.gz \
-C /tmp/restore \
etc/
# 使用 rsync 同步回原路径(保留权限)
rsync -avh /tmp/restore/etc/ /etc/
17.4 LVM 快照备份
LVM 快照提供时间点一致性备份,在备份过程中源 LV 可以继续读写,不影响业务运行,是数据库等需要一致性备份场景的最佳选择。
17.4.1 创建快照并归档备份
# 第一步:创建快照(大小 = 备份期间预计写入量)
lvcreate -L 2G -s -n datalv-backup /dev/datavg/datalv
lvdisplay /dev/datavg/datalv-backup
# 第二步:挂载快照(只读,保护数据不被修改)
mkdir -p /mnt/snapshot
mount -o ro /dev/datavg/datalv-backup /mnt/snapshot
# 第三步:从快照创建 tar 归档(-C 切换到快照目录,. 表示当前目录)
tar -czpf /backup/lvmdata-$(date +%F).tar.gz -C /mnt/snapshot .
# 第四步:卸载并删除快照(快照仅作临时用途,勿长期保留)
umount /mnt/snapshot
lvremove -f /dev/datavg/datalv-backup
LVM 快照的时间点一致性
快照创建瞬间,LVM 为原 LV 保留了一个冻结的数据视图(COW 机制:写时复制)。即使备份期间源 LV 持续写入,快照数据始终保持创建时刻的一致状态,保障恢复时的数据完整性。
17.4.2 使用快照回滚数据
此操作将 LV 数据回滚至快照时刻,不可逆
# 卸载逻辑卷(必须先卸载)
umount /mnt/lvmdata
# 合并快照到原 LV(触发回滚)
lvconvert --merge /dev/datavg/datalv-backup
# 重新激活逻辑卷(合并在重激活时完成)
lvchange -an /dev/datavg/datalv
lvchange -ay /dev/datavg/datalv
mount /dev/datavg/datalv /mnt/lvmdata
17.5 自动化备份(systemd Timer)
RHEL 9 推荐使用 systemd timer 替代传统 cron,日志集成更好,支持错过任务补执行,依赖管理更清晰。
17.5.1 创建备份脚本
tee /usr/local/bin/linuxdc-backup.sh << 'EOF'
#!/bin/bash
# linuxdc 自动化备份脚本
# 目标:/etc、/home、/data
# 策略:保留最近 7 天
set -euo pipefail
BACKUP_DIR="/backup"
DATE=$(date +%F)
LOG="/var/log/backup.log"
echo "$(date '+%F %T'): 开始备份" >> "$LOG"
# 创建今日备份目录
mkdir -p "${BACKUP_DIR}/${DATE}"
# 1. tar 归档 /etc 和 /home
tar -czpf "${BACKUP_DIR}/${DATE}/system.tar.gz" \
--exclude=/backup --exclude=/proc --exclude=/sys \
--exclude=/dev --exclude=/run \
/etc /home 2>> "$LOG"
# 2. rsync 增量同步 /data
rsync -avh --delete /data/ "${BACKUP_DIR}/${DATE}/data/" >> "$LOG" 2>&1
# 3. 清理 7 天前的备份
find "${BACKUP_DIR}" -maxdepth 1 -type d -mtime +7 \
-exec rm -rf {} \; 2>> "$LOG"
echo "$(date '+%F %T'): 备份完成,目录: ${BACKUP_DIR}/${DATE}" >> "$LOG"
EOF
chmod +x /usr/local/bin/linuxdc-backup.sh
17.5.2 创建 systemd Service 和 Timer
# Service unit(oneshot 类型,执行完即退出)
tee /etc/systemd/system/linuxdc-backup.service << 'EOF'
[Unit]
Description=linuxdc Automated Backup
After=local-fs.target network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/linuxdc-backup.sh
StandardOutput=journal
StandardError=journal
EOF
# Timer unit(每天凌晨 2:30 执行)
tee /etc/systemd/system/linuxdc-backup.timer << 'EOF'
[Unit]
Description=linuxdc Backup Daily Timer
Requires=linuxdc-backup.service
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# 启用并启动 timer
systemctl daemon-reload
systemctl enable --now linuxdc-backup.timer
# 验证 timer 已注册,查看下次执行时间
systemctl list-timers | grep backup
systemd timer 相比 cron 的优势
日志自动写入 journal(journalctl -u linuxdc-backup),无需手动配置日志重定向;Persistent=true 使系统关机期间错过的任务在下次启动时自动补执行;与 systemd 依赖管理体系完整集成,可设置 After、Requires 等依赖关系。
# 手动触发一次(测试备份脚本)
systemctl start linuxdc-backup.service
# 查看执行日志
journalctl -u linuxdc-backup.service -n 50
tail -20 /var/log/backup.log
17.6 备份策略总结
| 备份工具 | 适用场景 | 恢复粒度 | 恢复速度 |
|---|---|---|---|
rsync |
频繁增量同步、目录镜像 | 文件级 | 快(直接访问文件) |
tar |
全量归档、离线存储、跨系统传输 | 文件级 | 中(需先定位再解压) |
| LVM 快照 | 数据库一致性备份、快速回滚 | 卷级 | 极快(直接合并,秒级) |
企业推荐策略(3-2-1 原则):
- 3 份备份(1 份生产数据 + 2 份备份副本)
- 2 种不同存储介质(本地磁盘 + 远程服务器或云存储)
- 1 份异地(不同机房或地域)
17.7 常见问题与排查
| 问题现象 | 排查步骤 |
|---|---|
rsync 权限拒绝 |
确认目标目录写权限;远程场景检查 SSH 密钥配置 |
tar 归档损坏 |
tar -tzvf <file> 测试;检查磁盘空间:df -hT |
LVM 快照 Data% 快速增长 |
原 LV 写入量超预期;立即 lvextend -L +2G /dev/datavg/datalv-backup 扩大快照 |
| systemd timer 未按时执行 | systemctl status linuxdc-backup.timer;journalctl -u linuxdc-backup.service |
# 查看备份日志
tail -50 /var/log/backup.log
# 查看 timer 下次执行时间
systemctl list-timers linuxdc-backup.timer
17.8 实践任务
- 登录
linuxdc(SecureCRT 端口 2222,ops用户,密钥认证,sudo -i切换 root)。 - 使用
rsync备份/etc到/backup/etc-$(date +%F)/,验证文件完整性。 -
使用
tar归档备份/etc和/home,验证归档:tar -tzvf /backup/system-$(date +%F).tar.gz | wc -l -
创建 LVM 快照,只读挂载,tar 归档数据,卸载后删除快照。
-
创建备份脚本和 systemd timer,手动触发验证,查看 journal 日志:
systemctl start linuxdc-backup.service journalctl -u linuxdc-backup.service -f -
恢复演练:删除
/tmp/test-file,从 tar 归档中提取/etc/hostname并恢复。
17.9 自测问题
Q1:rsync --delete 的作用是什么?什么情况下不应使用?
--delete 使目标目录与源目录保持严格一致,删除目标中源已不存在的文件。不应使用的场景:需要保留历史文件的归档模式;或不确定源目录是否完整时(避免因源目录意外为空而清空整个备份目标,造成灾难性数据丢失)。
Q2:为什么 LVM 快照备份比普通 tar 备份更适合数据库场景?
数据库运行时,事务日志和数据文件持续更新,直接 tar 打包得到的是不一致的中间状态(如事务执行到一半),恢复后数据库无法正常启动。LVM 快照创建瞬间为数据提供一个冻结的时间点视图(COW 机制),即使快照期间数据库继续运行,备份的也是创建快照那一刻的完整一致状态。
Q3:systemd timer 的 Persistent=true 有什么作用?
若 timer 应执行时系统处于关机状态(如凌晨 2:30 系统恰好关机),Persistent=true 会在下次启动时立即补执行一次错过的任务,确保备份不被遗漏。默认(Persistent=false)则跳过错过的触发点,直接等待下次计划时间,可能导致数天未备份。
17.10 章节总结
本章建立了 RHEL 9 的完整备份与恢复体系:rsync 增量同步(本地与远程,含排除规则)、tar 全量归档(含完整性验证与文件级精准恢复)、LVM 快照(时间点一致性备份与快速回滚),以及基于 systemd timer 的自动化调度(每日凌晨 2:30,含错误日志与错过补执行)。每种备份方法均配套了恢复操作演练,切实落实"备份的价值取决于能否成功恢复"的核心理念。