备份与恢复

最后更新: 2026-01-19 作者: Linux Team
页面目录
目录

备份策略

备份类型

┌─────────────────────────────────────────────────────────────┐
│                    备份类型                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   完全备份 ── 备份所有数据                                  │
│   差异备份 ── 备份自上次完全备份以来的变化                  │
│   增量备份 ── 备份自上次任何备份以来的变化                  │
│                                                             │
│   完全 ──→ 差异 ──→ 差异 ──→ 差异                          │
│   完全 ──→ 增量 ──→ 增量 ──→ 增量                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

备份工具对比

工具 类型 特点
tar 文件 简单、通用
rsync 文件 增量、同步
duplicity 文件 加密、去重
Bacula 企业 完整方案
Amanda 企业 磁带支持
LVM快照 系统 即时快照

文件备份

tar备份

# 完全备份
tar -czvf /backup/home_$(date +%Y%m%d).tar.gz /home

# 排除文件
tar -czvf backup.tar.gz /home \
    --exclude='/home/*/.cache' \
    --exclude='*.tmp'

# 备份列表文件
tar -czvf backup.tar.gz -T /tmp/backup_list.txt

# 解压
tar -xzvf backup.tar.gz -C /restore/path

# 验证备份
tar -tzf backup.tar.gz | head
tar -dvf backup.tar.gz

rsync同步

# 本地同步
rsync -avz /src/ /dst/
rsync -avz --delete /src/ /dst/

# 远程同步
rsync -avz -e ssh /src/ user@host:/dst/
rsync -avz -e "ssh -p 2222" /src/ user@host:/dst/

# 增量同步
rsync -avz --link-dest=/backup/daily.0 /src/ /backup/daily.1/

# 常用选项
rsync -avz           # 归档、压缩
rsync -P             # 显示进度、保留部分文件
rsync --dry-run      # 预演
rsync --exclude       # 排除
rsync --bwlimit       # 限速

增量备份脚本

#!/bin/bash
# incremental_backup.sh

SRC="/home"
DST="/backup"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p "$DST/daily"

# 保留最近7天
KEEP=7

# 完全备份(每周日)
if [ $(date +%u) -eq 7 ]; then
    echo "Full backup..."
    rsync -av --delete "$SRC/" "$DST/weekly/full_$DATE/"
else
    # 增量备份
    echo "Incremental backup..."
    rsync -av --delete --link-dest="$DST/daily/previous" \
        "$SRC/" "$DST/daily/incremental_$DATE/"
fi

# 更新previous链接
rm -f "$DST/daily/previous"
cp -al "$DST/daily/incremental_$DATE/" "$DST/daily/previous"

# 清理旧备份
find "$DST/daily" -maxdepth 1 -type d -mtime +$KEEP -exec rm -rf {} \;

数据库备份

MySQL备份

# 完全备份
mysqldump -u root -p --all-databases > all_databases.sql

# 指定数据库
mysqldump -u root -p database_name > database_name.sql

# 带DROP TABLE
mysqldump -u root -p --add-drop-table database_name > database_name.sql

# 只备份表结构
mysqldump -u root -p --no-data database_name > structure.sql

# 压缩备份
mysqldump -u root -p database_name | gzip > backup.sql.gz

# 远程备份
mysqldump -h remote_host -u root -p database_name | gzip > backup.sql.gz

# 恢复
mysql -u root -p database_name < backup.sql
gunzip < backup.sql.gz | mysql -u root -p database_name

PostgreSQL备份

# 完全备份
pg_dump -U postgres database_name > backup.sql

# 压缩备份
pg_dump -U postgres database_name | gzip > backup.sql.gz

# 远程备份
pg_dump -h remote_host -U postgres database_name | gzip > backup.sql.gz

# 全量备份
pg_dumpall -U postgres > all_databases.sql

# 自定义格式(推荐)
pg_dump -Fc -U postgres database_name > backup.dump

# 恢复
psql -U postgres database_name < backup.sql
pg_restore -d database_name -U postgres backup.dump

系统快照

LVM快照

# 创建LVM快照
sudo lvcreate -L 10G -s -n home_snapshot /dev/vg00/lv_home

# 挂载快照
sudo mkdir -p /mnt/snapshot
sudo mount -o ro /dev/vg00/home_snapshot /mnt/snapshot

# 从快照恢复
sudo umount /mnt/snapshot
sudo lvconvert --merge /dev/vg00/home_snapshot

# 删除快照
sudo lvremove /dev/vg00/home_snapshot

系统镜像

# 使用dd备份整个磁盘
sudo dd if=/dev/sda of=/backup/disk.img bs=4M status=progress

# 压缩镜像
sudo dd if=/dev/sda | gzip > /backup/disk.img.gz

# 恢复到磁盘
sudo gzip -dc /backup/disk.img.gz | sudo dd of=/dev/sda

# 备份分区
sudo dd if=/dev/sda1 of=/backup/partition.img bs=4M status=progress

课后练习

实践任务
  1. 配置rsync自动备份
  2. 编写MySQL备份脚本
  3. 创建LVM快照
  4. 配置定时备份任务