第14课:系统备份与恢复

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

推广

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

系统备份与恢复

备份基础概念

1. 备份类型

完全备份 (Full Backup)

# 备份所有数据
# 优点:恢复简单快速
# 缺点:占用空间大,时间长

# 示例:完全备份
tar -czf /backup/full_backup_$(date +%Y%m%d).tar.gz /home /etc /var/www

增量备份 (Incremental Backup)

# 只备份自上次备份以来的变化
# 优点:备份快速,占用空间小
# 缺点:恢复复杂,需要所有增量备份

# 示例:增量备份
find /home -newer /backup/last_backup.timestamp -type f | tar -czf /backup/incremental_$(date +%Y%m%d).tar.gz -T -
touch /backup/last_backup.timestamp

差异备份 (Differential Backup)

# 备份自上次完全备份以来的所有变化
# 优点:恢复相对简单
# 缺点:备份文件逐渐增大

# 示例:差异备份
find /home -newer /backup/full_backup.timestamp -type f | tar -czf /backup/differential_$(date +%Y%m%d).tar.gz -T -

2. 备份策略

3-2-1备份策略

# 3份数据副本
# 2种不同的存储介质
# 1份异地备份

# 实施示例
# 本地磁盘备份
# 网络存储备份
# 云存储备份

备份频率规划

# 关键数据:每日备份
# 重要数据:每周备份
# 一般数据:每月备份
# 系统配置:变更时备份

文件和目录备份

1. tar命令备份

基本tar备份

# 创建压缩备份
tar -czf backup.tar.gz /path/to/backup

# 创建未压缩备份
tar -cf backup.tar /path/to/backup

# 排除特定文件
tar -czf backup.tar.gz --exclude='*.log' --exclude='*.tmp' /path/to/backup

# 备份多个目录
tar -czf backup.tar.gz /etc /home /var/www

# 显示备份进度
tar -czf backup.tar.gz /path/to/backup --verbose

# 验证备份完整性
tar -tzf backup.tar.gz

高级tar选项

# 增量备份
tar -czf backup_level0.tar.gz -g snapshot.file /home
tar -czf backup_level1.tar.gz -g snapshot.file /home

# 基于时间的备份
tar -czf backup.tar.gz --newer-mtime='2024-01-01' /home

# 保留权限和属性
tar -czf backup.tar.gz --preserve-permissions --preserve-order /home

# 分卷备份
tar -czf - /large/directory | split -b 1G - backup.tar.gz.

2. rsync同步备份

基本rsync使用

# 本地同步
rsync -av /source/ /destination/

# 远程同步
rsync -av /source/ user@remote:/destination/
rsync -av user@remote:/source/ /destination/

# 删除目标中不存在的文件
rsync -av --delete /source/ /destination/

# 排除文件
rsync -av --exclude='*.log' --exclude='*.tmp' /source/ /destination/

# 显示进度
rsync -av --progress /source/ /destination/

rsync高级选项

# 压缩传输
rsync -avz /source/ user@remote:/destination/

# 限制带宽
rsync -av --bwlimit=1000 /source/ /destination/

# 保留硬链接
rsync -avH /source/ /destination/

# 只同步更新的文件
rsync -avu /source/ /destination/

# 备份被替换的文件
rsync -av --backup --backup-dir=/backup/old /source/ /destination/

3. 自动化备份脚本

完整备份脚本

#!/bin/bash
# 自动化备份脚本

# 配置变量
BACKUP_SOURCE="/home /etc /var/www"
BACKUP_DEST="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="full_backup_$DATE.tar.gz"
LOG_FILE="/var/log/backup.log"
RETENTION_DAYS=30

# 创建备份目录
mkdir -p $BACKUP_DEST

# 记录开始时间
echo "$(date): 开始备份" >> $LOG_FILE

# 执行备份
tar -czf $BACKUP_DEST/$BACKUP_FILE $BACKUP_SOURCE 2>>$LOG_FILE

# 检查备份结果
if [ $? -eq 0 ]; then
    echo "$(date): 备份成功 - $BACKUP_FILE" >> $LOG_FILE
    
    # 验证备份完整性
    tar -tzf $BACKUP_DEST/$BACKUP_FILE >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "$(date): 备份验证成功" >> $LOG_FILE
    else
        echo "$(date): 备份验证失败" >> $LOG_FILE
    fi
else
    echo "$(date): 备份失败" >> $LOG_FILE
    exit 1
fi

# 清理旧备份
find $BACKUP_DEST -name "full_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete
echo "$(date): 清理完成,保留 $RETENTION_DAYS 天内的备份" >> $LOG_FILE

# 发送通知邮件
echo "备份完成: $BACKUP_FILE" | mail -s "备份报告" admin@example.com

echo "$(date): 备份任务完成" >> $LOG_FILE

增量备份脚本

#!/bin/bash
# 增量备份脚本

BACKUP_SOURCE="/home"
BACKUP_DEST="/backup/incremental"
DATE=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_FILE="/backup/snapshot.file"
LOG_FILE="/var/log/incremental_backup.log"

mkdir -p $BACKUP_DEST

# 检查是否存在快照文件
if [ ! -f $SNAPSHOT_FILE ]; then
    echo "$(date): 执行首次完全备份" >> $LOG_FILE
    tar -czf $BACKUP_DEST/full_$DATE.tar.gz -g $SNAPSHOT_FILE $BACKUP_SOURCE
else
    echo "$(date): 执行增量备份" >> $LOG_FILE
    tar -czf $BACKUP_DEST/inc_$DATE.tar.gz -g $SNAPSHOT_FILE $BACKUP_SOURCE
fi

if [ $? -eq 0 ]; then
    echo "$(date): 增量备份成功" >> $LOG_FILE
else
    echo "$(date): 增量备份失败" >> $LOG_FILE
fi

系统备份

1. 系统镜像备份

使用dd创建系统镜像

# 创建完整磁盘镜像
sudo dd if=/dev/sda of=/backup/system_image.img bs=4M status=progress

# 压缩镜像
sudo dd if=/dev/sda bs=4M | gzip > /backup/system_image.img.gz

# 创建分区镜像
sudo dd if=/dev/sda1 of=/backup/boot_partition.img bs=4M

# 通过网络备份
sudo dd if=/dev/sda bs=4M | ssh user@backup-server 'cat > /backup/system_image.img'

使用clonezilla

# 安装clonezilla
sudo apt install clonezilla

# 创建系统镜像 (通常使用Live CD)
# 1. 启动Clonezilla Live CD
# 2. 选择设备到镜像模式
# 3. 选择源磁盘和目标位置
# 4. 开始克隆过程

2. 文件系统快照

LVM快照

# 创建LVM快照
sudo lvcreate -L 1G -s -n home_snapshot /dev/vg0/home

# 挂载快照
sudo mkdir /mnt/snapshot
sudo mount /dev/vg0/home_snapshot /mnt/snapshot

# 备份快照
tar -czf /backup/home_snapshot_$(date +%Y%m%d).tar.gz -C /mnt/snapshot .

# 清理快照
sudo umount /mnt/snapshot
sudo lvremove /dev/vg0/home_snapshot

Btrfs快照

# 创建Btrfs快照
sudo btrfs subvolume snapshot /home /home/.snapshots/$(date +%Y%m%d_%H%M%S)

# 列出快照
sudo btrfs subvolume list /home

# 删除快照
sudo btrfs subvolume delete /home/.snapshots/snapshot_name

3. 数据库备份

MySQL备份脚本

#!/bin/bash
# MySQL自动备份脚本

DB_USER="backup_user"
DB_PASS="backup_password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

mkdir -p $BACKUP_DIR

# 获取所有数据库列表
DATABASES=$(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")

# 备份每个数据库
for db in $DATABASES; do
    echo "备份数据库: $db"
    mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --triggers $db > $BACKUP_DIR/${db}_$DATE.sql
    
    if [ $? -eq 0 ]; then
        gzip $BACKUP_DIR/${db}_$DATE.sql
        echo "数据库 $db 备份成功"
    else
        echo "数据库 $db 备份失败"
    fi
done

# 清理旧备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

远程备份

1. SSH远程备份

使用scp备份

# 备份到远程服务器
scp -r /important/data/ user@backup-server:/backup/

# 从远程服务器备份
scp -r user@remote-server:/important/data/ /local/backup/

# 使用密钥认证
scp -i ~/.ssh/backup_key -r /data/ user@backup-server:/backup/

使用rsync远程备份

# 远程同步备份
rsync -avz -e ssh /local/data/ user@backup-server:/backup/data/

# 使用特定端口
rsync -avz -e "ssh -p 2222" /local/data/ user@backup-server:/backup/

# 远程备份脚本
#!/bin/bash
REMOTE_HOST="backup-server"
REMOTE_USER="backup"
REMOTE_PATH="/backup/$(hostname)"
LOCAL_PATHS="/home /etc /var/www"

for path in $LOCAL_PATHS; do
    rsync -avz --delete -e ssh $path/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH$(basename $path)/
done

2. 云存储备份

AWS S3备份

# 安装AWS CLI
sudo apt install awscli

# 配置AWS凭证
aws configure

# 上传备份到S3
aws s3 cp /backup/backup.tar.gz s3://my-backup-bucket/

# 同步目录到S3
aws s3 sync /backup/ s3://my-backup-bucket/backups/

# S3备份脚本
#!/bin/bash
BACKUP_FILE="/backup/backup_$(date +%Y%m%d).tar.gz"
S3_BUCKET="s3://my-backup-bucket"

# 创建备份
tar -czf $BACKUP_FILE /home /etc

# 上传到S3
aws s3 cp $BACKUP_FILE $S3_BUCKET/

# 删除本地备份
rm $BACKUP_FILE

Google Cloud Storage备份

# 安装gsutil
curl https://sdk.cloud.google.com | bash

# 认证
gcloud auth login

# 上传备份
gsutil cp /backup/backup.tar.gz gs://my-backup-bucket/

# 同步目录
gsutil -m rsync -r /backup/ gs://my-backup-bucket/backups/

系统恢复

1. 文件恢复

从tar备份恢复

# 查看备份内容
tar -tzf backup.tar.gz

# 恢复所有文件
tar -xzf backup.tar.gz -C /

# 恢复特定文件
tar -xzf backup.tar.gz -C / etc/passwd etc/shadow

# 恢复到指定目录
tar -xzf backup.tar.gz -C /restore/

# 恢复时保留权限
tar -xzf backup.tar.gz --preserve-permissions -C /

从rsync备份恢复

# 恢复文件
rsync -av /backup/home/ /home/

# 从远程备份恢复
rsync -av user@backup-server:/backup/home/ /home/

# 恢复特定文件
rsync -av /backup/etc/passwd /etc/

2. 系统镜像恢复

使用dd恢复系统

# 恢复完整磁盘
sudo dd if=/backup/system_image.img of=/dev/sda bs=4M status=progress

# 恢复压缩镜像
gunzip -c /backup/system_image.img.gz | sudo dd of=/dev/sda bs=4M

# 恢复分区
sudo dd if=/backup/boot_partition.img of=/dev/sda1 bs=4M

3. 数据库恢复

MySQL恢复

# 恢复单个数据库
mysql -u root -p database_name < backup.sql

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

# 恢复所有数据库
mysql -u root -p < all_databases.sql

# 恢复脚本
#!/bin/bash
DB_USER="root"
DB_PASS="password"
BACKUP_FILE="$1"
DB_NAME="$2"

if [ -z "$BACKUP_FILE" ] || [ -z "$DB_NAME" ]; then
    echo "用法: $0 <备份文件> <数据库名>"
    exit 1
fi

# 创建数据库
mysql -u$DB_USER -p$DB_PASS -e "CREATE DATABASE IF NOT EXISTS $DB_NAME;"

# 恢复数据
if [[ $BACKUP_FILE == *.gz ]]; then
    gunzip < $BACKUP_FILE | mysql -u$DB_USER -p$DB_PASS $DB_NAME
else
    mysql -u$DB_USER -p$DB_PASS $DB_NAME < $BACKUP_FILE
fi

echo "数据库 $DB_NAME 恢复完成"

灾难恢复

1. 灾难恢复计划

恢复时间目标 (RTO)

# 定义系统恢复时间要求
# 关键系统:1小时内恢复
# 重要系统:4小时内恢复
# 一般系统:24小时内恢复

恢复点目标 (RPO)

# 定义数据丢失容忍度
# 关键数据:最多丢失15分钟数据
# 重要数据:最多丢失1小时数据
# 一般数据:最多丢失24小时数据

2. 系统恢复流程

紧急恢复步骤

#!/bin/bash
# 紧急系统恢复脚本

echo "开始紧急系统恢复..."

# 1. 评估损坏程度
echo "评估系统损坏程度..."
df -h
mount | grep "^/dev"

# 2. 挂载备份存储
echo "挂载备份存储..."
mount /dev/sdb1 /mnt/backup

# 3. 恢复关键配置文件
echo "恢复关键配置文件..."
tar -xzf /mnt/backup/config_backup.tar.gz -C / etc/passwd etc/shadow etc/group etc/sudoers

# 4. 恢复系统服务配置
echo "恢复系统服务配置..."
tar -xzf /mnt/backup/services_backup.tar.gz -C / etc/systemd etc/nginx etc/apache2

# 5. 恢复用户数据
echo "恢复用户数据..."
rsync -av /mnt/backup/home/ /home/

# 6. 恢复数据库
echo "恢复数据库..."
systemctl start mysql
mysql -u root -p < /mnt/backup/database_backup.sql

# 7. 重启关键服务
echo "重启关键服务..."
systemctl restart nginx
systemctl restart mysql
systemctl restart ssh

echo "紧急恢复完成,请验证系统功能"

3. 备份验证

备份完整性验证

#!/bin/bash
# 备份验证脚本

BACKUP_DIR="/backup"
LOG_FILE="/var/log/backup_verification.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] 开始备份验证" >> $LOG_FILE

# 验证tar备份
for backup in $BACKUP_DIR/*.tar.gz; do
    if [ -f "$backup" ]; then
        echo "验证备份: $backup"
        tar -tzf "$backup" >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo "[$DATE] $backup 验证成功" >> $LOG_FILE
        else
            echo "[$DATE] $backup 验证失败" >> $LOG_FILE
        fi
    fi
done

# 验证数据库备份
for db_backup in $BACKUP_DIR/*.sql.gz; do
    if [ -f "$db_backup" ]; then
        echo "验证数据库备份: $db_backup"
        gunzip -t "$db_backup" 2>/dev/null
        if [ $? -eq 0 ]; then
            echo "[$DATE] $db_backup 验证成功" >> $LOG_FILE
        else
            echo "[$DATE] $db_backup 验证失败" >> $LOG_FILE
        fi
    fi
done

echo "[$DATE] 备份验证完成" >> $LOG_FILE

自动化备份管理

1. 定时备份任务

crontab配置

# 编辑crontab
crontab -e

# 每日凌晨2点执行完全备份
0 2 * * * /usr/local/bin/full_backup.sh

# 每4小时执行增量备份
0 */4 * * * /usr/local/bin/incremental_backup.sh

# 每周日执行系统备份
0 3 * * 0 /usr/local/bin/system_backup.sh

# 每月1号清理旧备份
0 4 1 * * /usr/local/bin/cleanup_old_backups.sh

2. 备份监控

备份状态监控脚本

#!/bin/bash
# 备份状态监控

BACKUP_DIR="/backup"
ALERT_EMAIL="admin@example.com"
MAX_AGE_HOURS=25

# 检查最新备份时间
latest_backup=$(find $BACKUP_DIR -name "*.tar.gz" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
if [ -z "$latest_backup" ]; then
    echo "错误:未找到备份文件" | mail -s "备份告警" $ALERT_EMAIL
    exit 1
fi

# 检查备份文件年龄
backup_age=$(find $BACKUP_DIR -name "*.tar.gz" -type f -mtime -1 | wc -l)
if [ $backup_age -eq 0 ]; then
    echo "警告:超过24小时未执行备份" | mail -s "备份告警" $ALERT_EMAIL
fi

# 检查备份文件大小
backup_size=$(du -sh "$latest_backup" | cut -f1)
echo "最新备份: $latest_backup ($backup_size)"

总结

系统备份与恢复要点:

  1. 备份策略:制定合适的备份策略,实施3-2-1原则
  2. 自动化:使用脚本自动化备份过程,减少人为错误
  3. 验证测试:定期验证备份完整性,测试恢复流程
  4. 远程备份:实施异地备份,防范本地灾难
  5. 监控告警:建立备份监控机制,及时发现问题
  6. 文档记录:详细记录备份和恢复流程
  7. 定期演练:定期进行灾难恢复演练

下一课预告

在下一课中,我们将进行Linux运维实战,包括:

  • 综合运维场景
  • 故障排除实例
  • 性能优化案例
  • 最佳实践总结

💡 小贴士:备份是数据安全的最后一道防线。建议定期测试备份和恢复流程,确保在真正需要时能够快速有效地恢复系统和数据。

Vue3 + TypeScript 企业级项目实战

课程推荐

Vue3 + TypeScript 企业级项目实战
Python 全栈开发工程师培训

热门课程

Python 全栈开发工程师培训

📚 文章对你有帮助?请关注我的公众号,万分感谢!

获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号

关注公众号

第一时间获取最新技术文章

添加微信

添加微信

技术交流 · 问题答疑 · 学习指导

评论讨论

欢迎留下你的想法和建议