备份和恢复策略
备份是Linux系统管理中最重要的任务之一。通过制定合理的备份策略,可以在系统故障、数据丢失或安全事件发生时快速恢复系统和数据。
备份策略概述
备份类型
- 完全备份:备份所有选定的数据
- 增量备份:只备份自上次备份以来发生变化的数据
- 差异备份:备份自上次完全备份以来发生变化的数据
备份策略
- 3-2-1备份策略:3个副本,2种不同介质,1个异地备份
- 定期备份:根据数据重要性制定备份频率
- 验证备份:定期验证备份数据的完整性和可恢复性
文件系统备份
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
灾难恢复计划
恢复步骤
- 评估损坏程度:确定系统损坏范围
- 准备恢复环境:准备干净的系统环境
- 恢复系统文件:从备份恢复关键系统文件
- 恢复用户数据:从备份恢复用户数据
- 验证系统功能:检查系统各项功能是否正常
- 更新系统配置:根据需要更新系统配置
紧急恢复脚本
#!/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)"
备份最佳实践
安全考虑
- 加密备份:对敏感数据进行加密
- 访问控制:限制备份文件的访问权限
- 传输安全:使用加密传输备份数据
- 存储安全:将备份存储在安全的位置
加密备份示例
# 创建加密备份
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
通过制定和实施合理的备份和恢复策略,可以最大程度地保护系统和数据安全,确保在发生意外时能够快速恢复业务运行。