跳转至

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 依赖管理体系完整集成,可设置 AfterRequires 等依赖关系。

# 手动触发一次(测试备份脚本)
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.timerjournalctl -u linuxdc-backup.service
# 查看备份日志
tail -50 /var/log/backup.log

# 查看 timer 下次执行时间
systemctl list-timers linuxdc-backup.timer

17.8 实践任务

  1. 登录 linuxdc(SecureCRT 端口 2222,ops 用户,密钥认证,sudo -i 切换 root)。
  2. 使用 rsync 备份 /etc/backup/etc-$(date +%F)/,验证文件完整性。
  3. 使用 tar 归档备份 /etc/home,验证归档:

    tar -tzvf /backup/system-$(date +%F).tar.gz | wc -l
    
  4. 创建 LVM 快照,只读挂载,tar 归档数据,卸载后删除快照。

  5. 创建备份脚本和 systemd timer,手动触发验证,查看 journal 日志:

    systemctl start linuxdc-backup.service
    journalctl -u linuxdc-backup.service -f
    
  6. 恢复演练:删除 /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,含错误日志与错过补执行)。每种备份方法均配套了恢复操作演练,切实落实"备份的价值取决于能否成功恢复"的核心理念。