Skip to main content

备份和恢复策略

备份是Linux系统管理中最重要的任务之一。通过制定合理的备份策略,可以在系统故障、数据丢失或安全事件发生时快速恢复系统和数据。

备份策略概述

备份类型

  1. 完全备份:备份所有选定的数据
  2. 增量备份:只备份自上次备份以来发生变化的数据
  3. 差异备份:备份自上次完全备份以来发生变化的数据

备份策略

  1. 3-2-1备份策略:3个副本,2种不同介质,1个异地备份
  2. 定期备份:根据数据重要性制定备份频率
  3. 验证备份:定期验证备份数据的完整性和可恢复性

文件系统备份

tar命令

tar是最常用的备份工具,可以创建归档文件并进行压缩。

# 创建完全备份
tar -czvf backup_$(date +%Y%m%d).tar.gz /home /etc

# 创建增量备份
tar -czvf incremental_$(date +%Y%m%d).tar.gz --listed-incremental=backup.snar /home

# 排除特定文件
tar -czvf backup.tar.gz --exclude='*.tmp' --exclude='*.log' /home

# 从备份中恢复
tar -xzvf backup.tar.gz -C /

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

rsync命令

rsync是强大的文件同步工具,适合增量备份。

# 本地同步备份
rsync -avz /home/ /backup/home/

# 远程同步备份
rsync -avz /home/ user@remote:/backup/home/

# 增量备份(只同步变化的文件)
rsync -avz --delete /home/ /backup/home/

# 排除特定文件
rsync -avz --exclude='*.tmp' --exclude='*.log' /home/ /backup/home/

# 显示进度
rsync -avz --progress /home/ /backup/home/

系统备份

dd命令

dd命令可以创建磁盘或分区的完整镜像。

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

# 从镜像恢复磁盘
sudo dd if=/backup/system.img of=/dev/sda bs=4M status=progress

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

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

dump/restore命令

dump命令专门用于ext2/ext3/ext4文件系统的备份。

# 安装dump工具(Ubuntu/Debian)
sudo apt install dump

# 安装dump工具(CentOS/RHEL)
sudo yum install dump

# 创建文件系统备份
sudo dump -0u -f /backup/root.dump /dev/sda1

# 增量备份
sudo dump -1u -f /backup/root.incremental /dev/sda1

# 从备份恢复
sudo restore -rf /backup/root.dump

数据库备份

MySQL/MariaDB备份

# 备份所有数据库
mysqldump -u root -p --all-databases > mysql_backup_$(date +%Y%m%d).sql

# 备份特定数据库
mysqldump -u root -p database_name > database_backup.sql

# 备份特定表
mysqldump -u root -p database_name table_name > table_backup.sql

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

# 从备份恢复
mysql -u root -p database_name < database_backup.sql

# 从压缩备份恢复
gunzip -c database_backup.sql.gz | mysql -u root -p database_name

PostgreSQL备份

# 备份所有数据库
pg_dumpall -U postgres > postgres_backup_$(date +%Y%m%d).sql

# 备份特定数据库
pg_dump -U postgres database_name > database_backup.sql

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

# 从备份恢复
psql -U postgres database_name < database_backup.sql

# 从压缩备份恢复
gunzip -c database_backup.sql.gz | psql -U postgres database_name

自动化备份

crontab定时备份

# 编辑当前用户的crontab
crontab -e

# 编辑root用户的crontab
sudo crontab -e

# 每天凌晨2点备份
0 2 * * * /usr/local/bin/backup_script.sh

# 每周日凌晨3点完全备份
0 3 * * 0 /usr/local/bin/full_backup.sh

# 每天晚上10点增量备份
0 22 * * * /usr/local/bin/incremental_backup.sh

备份脚本示例

#!/bin/bash
# backup_script.sh - 自动备份脚本

# 配置变量
BACKUP_DIR="/backup"
SOURCE_DIRS="/home /etc /var/www"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_$DATE.tar.gz"

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

# 执行备份
echo "开始备份: $DATE"
tar -czvf $BACKUP_DIR/$BACKUP_NAME $SOURCE_DIRS

# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功: $BACKUP_DIR/$BACKUP_NAME"
# 记录备份日志
echo "$(date): 备份成功 - $BACKUP_NAME" >> $BACKUP_DIR/backup.log
else
echo "备份失败"
# 记录错误日志
echo "$(date): 备份失败 - $BACKUP_NAME" >> $BACKUP_DIR/error.log
exit 1
fi

# 清理7天前的备份
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete

echo "备份完成"

云存储备份

使用AWS S3

# 安装AWS CLI
sudo apt install awscli

# 配置AWS凭证
aws configure

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

# 从S3下载备份
aws s3 cp s3://my-backup-bucket/backup.tar.gz .

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

# 列出S3存储桶内容
aws s3 ls s3://my-backup-bucket/

使用rsync到远程服务器

# 设置SSH密钥认证
ssh-keygen -t rsa
ssh-copy-id user@remote-server

# 同步备份到远程服务器
rsync -avz /backup/ user@remote-server:/backup/

# 使用rsync守护进程
rsync -avz /backup/ rsync://remote-server/backup/

备份验证和恢复测试

备份验证脚本

#!/bin/bash
# verify_backup.sh - 备份验证脚本

BACKUP_FILE=$1

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

if [ ! -f "$BACKUP_FILE" ]; then
echo "备份文件不存在: $BACKUP_FILE"
exit 1
fi

# 验证tar文件完整性
if tar -tzf "$BACKUP_FILE" > /dev/null 2>&1; then
echo "备份文件完整性验证通过: $BACKUP_FILE"
# 显示备份内容摘要
echo "备份内容:"
tar -tzf "$BACKUP_FILE" | head -10
else
echo "备份文件损坏: $BACKUP_FILE"
exit 1
fi

恢复测试脚本

#!/bin/bash
# restore_test.sh - 恢复测试脚本

BACKUP_FILE=$1
TEST_DIR="/tmp/restore_test"

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

# 创建测试目录
mkdir -p $TEST_DIR

# 解压备份到测试目录
echo "正在解压备份到测试目录..."
tar -xzf "$BACKUP_FILE" -C $TEST_DIR

if [ $? -eq 0 ]; then
echo "恢复测试成功"
echo "测试文件位于: $TEST_DIR"
# 显示恢复的文件统计
find $TEST_DIR -type f | wc -l
else
echo "恢复测试失败"
exit 1
fi

# 清理测试目录
# rm -rf $TEST_DIR

灾难恢复计划

恢复步骤

  1. 评估损坏程度:确定系统损坏范围
  2. 准备恢复环境:准备干净的系统环境
  3. 恢复系统文件:从备份恢复关键系统文件
  4. 恢复用户数据:从备份恢复用户数据
  5. 验证系统功能:检查系统各项功能是否正常
  6. 更新系统配置:根据需要更新系统配置

紧急恢复脚本

#!/bin/bash
# emergency_restore.sh - 紧急恢复脚本

BACKUP_SERVER="backup.example.com"
BACKUP_PATH="/backup/latest"
RESTORE_DIRS="/etc /home /var/www"

echo "=== 紧急系统恢复 ==="
echo "开始时间: $(date)"

# 挂载备份服务器
sudo mkdir -p /mnt/backup
sudo mount $BACKUP_SERVER:$BACKUP_PATH /mnt/backup

if [ $? -ne 0 ]; then
echo "挂载备份服务器失败"
exit 1
fi

# 停止关键服务
sudo systemctl stop apache2
sudo systemctl stop mysql

# 恢复系统配置
echo "恢复系统配置..."
sudo rsync -avz /mnt/backup/etc/ /etc/

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

# 恢复网站数据
echo "恢复网站数据..."
sudo rsync -avz /mnt/backup/var/www/ /var/www/

# 恢复数据库
echo "恢复数据库..."
sudo rsync -avz /mnt/backup/var/lib/mysql/ /var/lib/mysql/

# 重启服务
sudo systemctl start mysql
sudo systemctl start apache2

# 卸载备份服务器
sudo umount /mnt/backup

echo "恢复完成: $(date)"

备份最佳实践

安全考虑

  1. 加密备份:对敏感数据进行加密
  2. 访问控制:限制备份文件的访问权限
  3. 传输安全:使用加密传输备份数据
  4. 存储安全:将备份存储在安全的位置

加密备份示例

# 创建加密备份
tar -czf - /home | gpg --symmetric --cipher-algo AES256 > backup.tar.gz.gpg

# 从加密备份恢复
gpg --decrypt backup.tar.gz.gpg | tar -xzf -

# 使用密码文件加密
echo "password" > passphrase.txt
tar -czf - /home | gpg --batch --passphrase-file passphrase.txt --symmetric > backup.tar.gz.gpg

监控和报警

# 备份监控脚本
#!/bin/bash
# backup_monitor.sh

BACKUP_LOG="/backup/backup.log"
ALERT_EMAIL="admin@example.com"

# 检查最近24小时是否有备份
if find /backup -name "backup_*.tar.gz" -mtime -1 | grep -q .; then
echo "备份正常"
else
echo "警告: 24小时内没有新的备份" | mail -s "备份警告" $ALERT_EMAIL
fi

# 检查备份大小
for backup in /backup/backup_*.tar.gz; do
size=$(du -m "$backup" | cut -f1)
if [ $size -lt 100 ]; then
echo "警告: 备份文件过小: $backup (${size}MB)" | mail -s "备份警告" $ALERT_EMAIL
fi
done

通过制定和实施合理的备份和恢复策略,可以最大程度地保护系统和数据安全,确保在发生意外时能够快速恢复业务运行。