Linux服务器管理完全攻略 第9篇:备份与恢复策略
Linux Server Administration Complete Guide Part 9
前言:没有备份就没有数据
数据丢失随时可能发生。硬件故障、人为错误、安全入侵、自然灾害等,应对各种情况的备份策略是服务器运维的必需品。
1. 备份策略规划
1.1 3-2-1备份规则
# 3-2-1规则
- 保持3份数据副本
- 使用2种不同的存储介质
- 1份保存在异地
1.2 备份类型
# 完整备份(Full Backup)
- 复制所有数据
- 恢复最简单
- 需要最多时间和空间
# 增量备份(Incremental Backup)
- 只备份自上次备份后更改的文件
- 快速且节省空间
- 恢复时需要完整备份+所有增量
# 差异备份(Differential Backup)
- 备份自上次完整备份后更改的文件
- 中等时间/空间需求
- 恢复时需要完整备份+最后一次差异
2. 使用tar备份
2.1 基本备份
# 创建压缩备份
tar -czvf backup_$(date +%Y%m%d).tar.gz /path/to/data
# 排除特定目录
tar -czvf backup.tar.gz --exclude='*.log' --exclude='cache' /data
# 分割压缩(大文件)
tar -cvf - /data | split -b 1G - backup_part_
# 解压备份
tar -xzvf backup.tar.gz -C /restore/path
2.2 增量备份
# 使用快照文件进行增量备份
# 第一次(完整)
tar -czvf full_backup.tar.gz -g /var/backup/snapshot.snar /data
# 第二次(增量)
tar -czvf incr_backup_1.tar.gz -g /var/backup/snapshot.snar /data
# 恢复(按顺序)
tar -xzvf full_backup.tar.gz -g /dev/null -C /restore
tar -xzvf incr_backup_1.tar.gz -g /dev/null -C /restore
3. 使用rsync备份
3.1 本地同步
# 基本同步
rsync -avh /source/ /backup/
# 同步删除的文件
rsync -avh --delete /source/ /backup/
# 显示进度
rsync -avh --progress /source/ /backup/
# 测试运行(dry-run)
rsync -avhn /source/ /backup/
3.2 远程备份
# 通过SSH远程备份
rsync -avhz -e ssh /local/data/ user@remote:/backup/
# 带宽限制
rsync -avhz --bwlimit=1000 /data/ user@remote:/backup/
# 断点续传
rsync -avhz --partial --progress /data/ user@remote:/backup/
# 使用特定SSH密钥
rsync -avhz -e "ssh -i ~/.ssh/backup_key" /data/ user@remote:/backup/
3.3 rsync备份脚本
#!/bin/bash
# rsync_backup.sh
SOURCE="/home /etc /var/www"
DEST="/mnt/backup"
LOG="/var/log/backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
echo "=== 备份开始: $DATE ===" >> $LOG
for dir in $SOURCE; do
rsync -avh --delete \
--exclude='*.tmp' \
--exclude='cache' \
"$dir" "$DEST" >> $LOG 2>&1
done
echo "=== 备份完成: $(date +%Y%m%d_%H%M%S) ===" >> $LOG
4. 数据库备份
4.1 MySQL/MariaDB
# 完整备份
mysqldump -u root -p --all-databases > all_db_$(date +%Y%m%d).sql
# 特定数据库
mysqldump -u root -p mydb > mydb_$(date +%Y%m%d).sql
# 压缩备份
mysqldump -u root -p mydb | gzip > mydb_$(date +%Y%m%d).sql.gz
# 恢复
mysql -u root -p < backup.sql
gunzip < backup.sql.gz | mysql -u root -p mydb
4.2 PostgreSQL
# 完整备份
pg_dumpall -U postgres > all_db_$(date +%Y%m%d).sql
# 特定数据库
pg_dump -U postgres mydb > mydb_$(date +%Y%m%d).sql
# 自定义格式(支持并行恢复)
pg_dump -U postgres -Fc mydb > mydb.dump
# 恢复
psql -U postgres < backup.sql
pg_restore -U postgres -d mydb mydb.dump
5. 自动化备份
5.1 cron配置
# crontab -e
# 每天凌晨2点完整备份
0 2 * * * /root/scripts/daily_backup.sh
# 每周日完整备份
0 3 * * 0 /root/scripts/weekly_backup.sh
# 每小时增量备份
0 * * * * /root/scripts/hourly_incremental.sh
5.2 综合备份脚本
#!/bin/bash
# comprehensive_backup.sh
# 配置
BACKUP_DIR="/mnt/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30
LOG="/var/log/backup.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG
}
# 创建备份目录
mkdir -p "$BACKUP_DIR/$DATE"
log "备份开始"
# 系统配置备份
tar -czf "$BACKUP_DIR/$DATE/etc.tar.gz" /etc 2>/dev/null
log "系统配置备份完成"
# Web数据备份
tar -czf "$BACKUP_DIR/$DATE/www.tar.gz" /var/www 2>/dev/null
log "Web数据备份完成"
# MySQL备份
mysqldump -u root --all-databases | gzip > "$BACKUP_DIR/$DATE/mysql.sql.gz"
log "MySQL备份完成"
# 删除旧备份
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
log "旧备份清理完成"
log "备份完成"
6. 恢复步骤
6.1 文件恢复
# tar解压
tar -xzvf backup.tar.gz -C /restore/path
# 仅恢复特定文件
tar -xzvf backup.tar.gz -C /restore path/to/file
# rsync恢复
rsync -avh /backup/data/ /restore/data/
6.2 系统恢复
# 1. 从Live USB/CD启动
# 2. 挂载文件系统
mount /dev/sda1 /mnt
# 3. 从备份恢复
tar -xzvf /backup/root.tar.gz -C /mnt
# 4. 恢复引导程序
grub-install --root-directory=/mnt /dev/sda
# 5. 重启
7. 恢复测试
#!/bin/bash
# backup_verify.sh
BACKUP_FILE="$1"
TEST_DIR="/tmp/backup_test_$$"
mkdir -p "$TEST_DIR"
echo "验证备份文件: $BACKUP_FILE"
# 检查压缩完整性
if tar -tzf "$BACKUP_FILE" > /dev/null 2>&1; then
echo "压缩完整性: OK"
else
echo "压缩完整性: FAILED"
exit 1
fi
# 测试恢复
tar -xzf "$BACKUP_FILE" -C "$TEST_DIR"
FILE_COUNT=$(find "$TEST_DIR" -type f | wc -l)
echo "恢复文件数: $FILE_COUNT"
# 清理
rm -rf "$TEST_DIR"
echo "验证完成"
8. 云备份
# AWS S3备份
aws s3 sync /data s3://mybucket/backup/
# Google Cloud Storage
gsutil rsync -r /data gs://mybucket/backup/
# rclone(支持多种云服务)
rclone sync /data remote:backup/
9. 灾难恢复计划(DRP)
# 灾难恢复计划检查清单
1. 识别关键数据和优先级
2. 定义RPO(恢复点目标)
3. 定义RTO(恢复时间目标)
4. 记录备份位置和方法
5. 记录恢复步骤
6. 定期进行恢复测试
7. 维护负责人联系方式和角色
8. 定期审查和更新
总结
备份是服务器运维的生命线。通过定期备份、恢复测试和灾难恢复计划,可以在任何情况下保护您的数据。最后一篇将讲解安全加固和漏洞管理。