备份与恢复
最后更新: 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
课后练习
实践任务
- 配置rsync自动备份
- 编写MySQL备份脚本
- 创建LVM快照
- 配置定时备份任务