# Linux 备份与恢复

URL: https://caijiao.org/linux/system/backup-recovery
Source: docs/linux/system/backup-recovery.md
Description: Linux系统备份与恢复全面教程，包括文件备份、系统备份、数据恢复策略、自动化备份、备份工具选择与最佳实践，确保数据安全和业务连续性。

备份与恢复是系统管理中至关重要的环节，它确保数据安全和业务连续性。无论是防止意外删除、系统故障、硬件损坏，还是应对勒索软件攻击，有效的备份策略都能帮助快速恢复系统和数据。本章节将详细介绍Linux系统中的备份与恢复策略、工具和最佳实践。

## 备份基础知识

### 备份的重要性

- **数据保护**：防止数据丢失，确保业务连续性
- **灾难恢复**：在系统崩溃或自然灾害后快速恢复业务
- **法规遵从**：满足行业法规对数据保留的要求
- **开发支持**：为开发和测试提供数据副本
- **版本控制**：保存数据的历史版本，便于追踪变更

### 备份类型

#### 完全备份

完全备份是备份所有数据的副本，无论数据是否发生变化。

- **优点**：恢复速度快，只需一个备份文件
- **缺点**：备份时间长，占用空间大
- **适用场景**：定期全量备份，作为其他备份类型的基础

#### 增量备份

增量备份只备份自上次备份以来发生变化的数据。

- **优点**：备份时间短，占用空间小
- **缺点**：恢复复杂，需要最后一次完全备份和所有增量备份
- **适用场景**：频繁备份，减少备份窗口

#### 差异备份

差异备份备份自上次完全备份以来发生变化的数据。

- **优点**：恢复相对简单，需要最后一次完全备份和一个差异备份
- **缺点**：备份时间随时间增长，占用空间较大
- **适用场景**：介于完全备份和增量备份之间的折中方案

### 备份策略

#### 3-2-1 备份原则

一个常用的备份策略是3-2-1原则：
- **3份**：至少保留3份数据副本
- **2种**：使用2种不同的存储介质
- **1份**：至少1份异地存储的备份

#### 备份频率

根据数据重要性和变更频率确定备份频率：
- **关键数据**：每日或每小时备份
- **重要数据**：每周备份
- **一般数据**：每月备份
- **系统配置**：每次变更后备份

#### 备份保留策略

- **保留期限**：根据业务需求和法规要求确定备份保留时间
- **轮换策略**：使用GFS (Grandfather-Father-Son) 备份轮换策略
  - **Son**：每日备份，保留一周
  - **Father**：每周备份，保留一个月
  - **Grandfather**：每月备份，保留一年或更长时间

## 文件备份工具

### 1. rsync

`rsync` 是一个强大的文件同步和备份工具，可以高效地传输和同步文件。

```bash
# 基本语法
rsync [选项] 源目录 目标目录

# 常用选项
# -a: 归档模式，保留文件属性、权限等
# -v: 详细输出
# -z: 压缩传输数据
# -h: 以人类可读的格式输出
# -n: 模拟运行，不实际执行操作
# --delete: 删除目标目录中源目录不存在的文件

# 示例：将本地目录备份到远程服务器
rsync -avz /path/to/source username@remote:/path/to/destination

# 示例：从远程服务器备份到本地
rsync -avz username@remote:/path/to/source /path/to/destination

# 示例：使用SSH端口
rsync -avz -e "ssh -p 2222" /path/to/source username@remote:/path/to/destination
```

### 2. tar

`tar` 命令用于创建归档文件，可以结合压缩工具使用，是最常用的备份工具之一。

```bash
# 基本语法
tar [选项] 归档文件名 源目录

# 常用选项
# -c: 创建归档文件
# -v: 详细输出
# -f: 指定归档文件名
# -z: 使用gzip压缩
# -j: 使用bzip2压缩
# -J: 使用xz压缩
# -x: 解压归档文件

# 示例：创建gzip压缩的备份
Tar -czvf backup_$(date +%Y%m%d).tar.gz /path/to/source

# 示例：创建bzip2压缩的备份
Tar -cjvf backup_$(date +%Y%m%d).tar.bz2 /path/to/source

# 示例：创建xz压缩的备份
Tar -cJvf backup_$(date +%Y%m%d).tar.xz /path/to/source

# 示例：解压备份
tar -xzvf backup.tar.gz
```

### 3. dd

`dd` 命令用于低级复制，可以复制整个磁盘或分区。

```bash
# 基本语法
dd if=输入文件 of=输出文件 bs=块大小

# 常用选项
# if: 输入文件/设备
# of: 输出文件/设备
# bs: 块大小
# status=progress: 显示进度

# 示例：备份整个磁盘
Dd if=/dev/sda of=/dev/sdb bs=4M status=progress

# 示例：备份磁盘到镜像文件
Dd if=/dev/sda of=/backup/disk_image.img bs=4M status=progress

# 示例：从镜像文件恢复磁盘
Dd if=/backup/disk_image.img of=/dev/sda bs=4M status=progress

# 示例：备份分区
Dd if=/dev/sda1 of=/backup/partition1.img bs=4M status=progress
```

### 4. cpio

`cpio` 命令用于创建归档文件，与find命令结合使用效果更佳。

```bash
# 基本语法
find 源目录 -type f | cpio -o > 归档文件

# 示例：备份目录内容到归档文件
find /path/to/source -type f | cpio -ov > backup.cpio

# 示例：从归档文件恢复
cpio -idv < backup.cpio
```

## 系统备份工具

### 1. Clonezilla

Clonezilla是一个开源的磁盘克隆和分区工具，可以用于系统备份和恢复。

- **功能**：
  - 支持完整磁盘和分区备份
  - 支持网络备份和恢复
  - 支持多种文件系统
  - 支持多种压缩方法

- **使用方法**：
  - 下载Clonezilla Live ISO
  - 制作启动U盘或光盘
  - 从Clonezilla启动进行备份或恢复

### 2. SystemRescue

SystemRescue是一个Linux系统救援工具，集成了多种系统管理和备份恢复工具。

- **功能**：
  - 磁盘分区和格式化
  - 文件系统检查和修复
  - 数据恢复和备份
  - 网络工具

- **使用方法**：
  - 下载SystemRescue ISO
  - 制作启动U盘或光盘
  - 从SystemRescue启动进行系统救援

### 3. Timeshift

Timeshift是一个Linux系统快照工具，类似于Windows的系统还原功能。

```bash
# 安装Timeshift（Debian/Ubuntu）
sudo apt install timeshift

# 安装Timeshift（CentOS/RHEL）
sudo dnf install timeshift

# 使用Timeshift GUI界面进行备份和恢复
Timeshift-gtk
```

### 4. Amanda (Advanced Maryland Automatic Network Disk Archiver)

Amanda是一个企业级的备份工具，支持网络备份和自动化。

- **功能**：
  - 网络备份
  - 自动化备份
  - 备份调度
  - 备份验证

## 数据库备份

### MySQL/MariaDB备份

```bash
# 使用mysqldump备份所有数据库
mysqldump -u root -p --all-databases > all_databases_backup.sql

# 备份单个数据库
mysqldump -u root -p database_name > database_backup.sql

# 备份特定表
mysqldump -u root -p database_name table1 table2 > tables_backup.sql

# 备份数据库结构（无数据）
mysqldump -u root -p --no-data database_name > database_structure.sql

# 恢复数据库
mysql -u root -p database_name < database_backup.sql
```

### PostgreSQL备份

```bash
# 备份单个数据库
pg_dump -U username database_name > database_backup.sql

# 备份所有数据库
pg_dumpall -U username > all_databases_backup.sql

# 恢复数据库
psql -U username database_name < database_backup.sql

# 使用pg_dump创建压缩备份
pg_dump -U username database_name | gzip > database_backup.sql.gz

# 从压缩备份恢复
Gunzip -c database_backup.sql.gz | psql -U username database_name
```

## 自动化备份

### 使用cron定时执行备份

```bash
# 编辑crontab
crontab -e

# 示例：每天凌晨2点执行rsync备份
0 2 * * * rsync -avz /path/to/source /path/to/backup/daily_$(date +\%Y\%m\%d)

# 示例：每周日凌晨3点执行tar备份
0 3 * * 0 tar -czvf /path/to/backup/weekly_$(date +\%Y\%m\%d).tar.gz /path/to/source

# 示例：每月1日凌晨4点执行完整备份
0 4 1 * * tar -czvf /path/to/backup/monthly_$(date +\%Y\%m).tar.gz /path/to/source
```

### 自动备份脚本示例

```bash
#!/bin/bash

# 备份脚本配置
BACKUP_SOURCE="/path/to/source"
BACKUP_DEST="/path/to/backup"
LOG_FILE="/path/to/backup.log"
DATE=$(date +%Y%m%d)
TIME=$(date +%H%M%S)

# 创建备份目录
mkdir -p "$BACKUP_DEST/daily"
mkdir -p "$BACKUP_DEST/weekly"
mkdir -p "$BACKUP_DEST/monthly"

# 记录日志
echo "===== 备份开始: $(date) ====" >> $LOG_FILE

# 执行每日备份
echo "执行每日备份..." >> $LOG_FILE
rsync -avz "$BACKUP_SOURCE" "$BACKUP_DEST/daily/backup_$DATE" >> $LOG_FILE 2>&1

# 检查是否为周日（每周备份）
if [ $(date +%u) -eq 7 ]; then
  echo "执行每周备份..." >> $LOG_FILE
  tar -czvf "$BACKUP_DEST/weekly/backup_weekly_$DATE.tar.gz" "$BACKUP_SOURCE" >> $LOG_FILE 2>&1
fi

# 检查是否为每月1日（每月备份）
if [ $(date +%d) -eq 01 ]; then
  echo "执行每月备份..." >> $LOG_FILE
  tar -czvf "$BACKUP_DEST/monthly/backup_monthly_$(date +%Y%m).tar.gz" "$BACKUP_SOURCE" >> $LOG_FILE 2>&1
fi

# 清理旧备份（保留7天的每日备份）
find "$BACKUP_DEST/daily" -type d -mtime +7 -exec rm -rf {} \;
echo "清理7天前的每日备份" >> $LOG_FILE

# 清理旧备份（保留4周的每周备份）
find "$BACKUP_DEST/weekly" -name "*.tar.gz" -mtime +28 -exec rm -f {} \;
echo "清理4周前的每周备份" >> $LOG_FILE

# 清理旧备份（保留12个月的每月备份）
find "$BACKUP_DEST/monthly" -name "*.tar.gz" -mtime +365 -exec rm -f {} \;
echo "清理12个月前的每月备份" >> $LOG_FILE

echo "===== 备份结束: $(date) ====" >> $LOG_FILE
echo "" >> $LOG_FILE

# 发送备份完成通知
# mail -s "备份完成通知" user@example.com < $LOG_FILE
```

## 备份验证和测试

### 备份验证

- **完整性检查**：验证备份文件是否完整无损
- **内容验证**：确认备份包含所需的所有文件和数据
- **恢复测试**：定期测试从备份恢复数据

```bash
# 验证tar备份文件
Tar -tvf backup.tar.gz | grep "重要文件"

# 测试从备份恢复到临时目录
mkdir -p /tmp/test_restore
tar -xzvf backup.tar.gz -C /tmp/test_restore
ls -la /tmp/test_restore
```

### 定期恢复测试

建立定期恢复测试计划，确保备份在需要时能够成功恢复。

- **测试频率**：每月或每季度进行一次
- **测试环境**：使用独立的测试环境
- **测试场景**：模拟各种故障情况
- **测试文档**：记录恢复过程和结果

## 灾难恢复计划

### 灾难恢复计划要素

1. **风险评估**：识别潜在的灾难场景和影响
2. **恢复目标**：
   - RTO (Recovery Time Objective)：恢复时间目标
   - RPO (Recovery Point Objective)：恢复点目标
3. **恢复策略**：确定各种灾难场景的恢复方法
4. **角色和责任**：明确灾难恢复过程中的角色和责任
5. **沟通计划**：建立灾难发生时的沟通机制
6. **恢复流程**：详细的恢复步骤和操作手册
7. **测试和演练**：定期测试和演练灾难恢复计划

### 灾难恢复演练

- **桌面演练**：讨论灾难情景和应对措施
- **功能演练**：测试特定的恢复功能
- **全面演练**：模拟真实灾难场景的完整恢复过程
- **部分演练**：在生产环境中进行有限的恢复测试

## 备份安全

### 数据加密

保护备份数据的安全，防止未授权访问。

```bash
# 使用GPG加密备份
Tar -czvf - /path/to/source | gpg --encrypt --recipient user@example.com -o backup.tar.gz.gpg

# 解密备份
gpg --decrypt backup.tar.gz.gpg | tar -xzvf -

# 使用OpenSSL加密备份
tar -czvf - /path/to/source | openssl enc -aes-256-cbc -salt -out backup.tar.gz.enc

# 解密备份
openssl enc -d -aes-256-cbc -in backup.tar.gz.enc | tar -xzvf -
```

### 访问控制

- **权限设置**：限制备份文件的访问权限
- **身份验证**：使用强密码和密钥认证
- **网络安全**：通过安全通道传输备份数据

```bash
# 设置备份目录权限
chmod -R 600 /path/to/backup
```

### 异地备份

- **云存储**：使用AWS S3、Google Cloud Storage等云服务
- **远程服务器**：备份到位于不同地理位置的服务器
- **物理介质**：定期将备份数据复制到物理介质并存储在异地

```bash
# 备份到AWS S3（需要安装aws-cli）
aws s3 cp backup.tar.gz s3://my-backup-bucket/

# 从S3恢复
aws s3 cp s3://my-backup-bucket/backup.tar.gz .
```

## 备份工具比较

| 工具 | 类型 | 特点 | 适用场景 |
|------|------|------|----------|
| rsync | 文件同步 | 增量备份，快速 | 日常文件备份，服务器同步 |
| tar | 文件归档 | 灵活，广泛支持 | 系统配置，文件集合备份 |
| dd | 磁盘复制 | 底层复制，完整备份 | 磁盘克隆，系统备份 |
| Clonezilla | 系统备份 | 网络支持，批量操作 | 企业级系统部署和恢复 |
| Timeshift | 系统快照 | 简单易用，类似于系统还原 | 桌面系统备份和恢复 |
| Amanda | 企业备份 | 自动化，网络支持 | 企业环境，多服务器备份 |

## 备份最佳实践

### 规划与准备

1. **制定备份策略**：明确备份内容、频率、保留期限
2. **选择合适的工具**：根据需求选择最适合的备份工具
3. **测试备份系统**：在实施前进行全面测试
4. **文档记录**：详细记录备份流程和配置

### 实施与管理

1. **自动化备份**：使用cron等工具实现自动化
2. **监控备份状态**：确保备份任务成功完成
3. **版本控制**：保留多个版本的备份
4. **定期审查**：定期审查备份策略和执行情况

### 恢复与优化

1. **定期测试恢复**：验证备份的可恢复性
2. **优化备份性能**：调整备份参数，提高效率
3. **存储空间管理**：合理规划备份存储空间
4. **持续改进**：根据实际情况调整备份策略

## 总结

本章节详细介绍了Linux系统中的备份与恢复相关知识，包括备份基础知识、各类备份工具、自动化备份、备份验证、灾难恢复计划、备份安全以及最佳实践。通过学习本章节，您应该能够建立有效的备份策略，选择合适的备份工具，实现自动化备份，确保数据安全和业务连续性。

在实际工作中，备份与恢复是一项持续的工作，需要定期审查和优化。记住3-2-1备份原则：保持3份数据副本，使用2种不同的存储介质，至少1份异地存储。只有经过验证的备份才是真正有效的备份，定期进行恢复测试是确保备份可用性的关键。
