➔
数据是服务器上最宝贵的资产。无论是系统崩溃、误操作还是安全攻击,定期备份都是最后的防线。本文介绍在Linux上建立自动化备份方案的最佳实践。
▶一、数据库自动备份(以MySQL为例)
code
#!/bin/bash
# /usr/local/bin/mysql_backup.sh
BACKUP_DIR="/data/backup/mysql"
DB_USER="root"
DB_PASS="your_password"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
mysqldump -u$DB_USER -p$DB_PASS --all-databases --single-transaction --routines --events | gzip > $BACKUP_DIR/all_dbs_$DATE.sql.gz
# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "[$(date)] MySQL backup completed: all_dbs_$DATE.sql.gz"
设置执行权限并添加到crontab:
code
chmod +x /usr/local/bin/mysql_backup.sh
crontab -e
# 每天凌晨3点执行备份
0 3 * * * /usr/local/bin/mysql_backup.sh
▶二、文件和目录备份
code
#!/bin/bash
# /usr/local/bin/file_backup.sh
BACKUP_DIR="/data/backup/files"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# 备份网站目录
tar -czf $BACKUP_DIR/www_$DATE.tar.gz /var/www/
# 备份Nginx配置
tar -czf $BACKUP_DIR/nginx_conf_$DATE.tar.gz /etc/nginx/
# 备份到远程服务器(使用rsync)
rsync -avz --delete $BACKUP_DIR/ user@backup-server:/backup/$(hostname)/
# 保留30天本地备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
▶三、系统快照备份
如果使用云服务商,强烈推荐使用云服务商提供的快照功能:
- ●自动快照策略:设置每天或每周自动创建系统盘快照
- ●保留策略:保留最近7天的快照,平衡成本与安全
- ●跨区域复制:将快照复制到不同地域,防止单地域故障
▶四、备份恢复演练
定期检查备份文件的可用性:
code
# 检查备份文件完整性
gunzip -t /data/backup/mysql/all_dbs_$(date +%Y%m%d).sql.gz
# 在测试环境中恢复验证
mysql -u root -p test_restore < /tmp/all_dbs_test.sql
▶五、备份策略建议
- ●3-2-1原则:至少3份备份,2种不同介质,1份异地存储
- ●数据库:每天全量备份,重要业务考虑binlog实时备份
- ●配置文件:每次变更后自动备份,保留历史版本
- ●监控告警:备份失败时发送通知
▶六、增量备份方案
全量备份耗时长、占用空间大,推荐结合增量备份使用。使用rsync实现文件级增量同步:
code
# rsync增量备份脚本
rsync -avz --delete --link-dest=/backup/full/$(date -d yesterday +%Y%m%d) /data/www/ /backup/incremental/$(date +%Y%m%d)/
# 每周一次全量备份,每天增量备份
# crontab配置
0 2 * * 0 /usr/local/bin/full_backup.sh
0 3 * * 1-6 /usr/local/bin/incremental_backup.sh
▶七、备份验证与恢复演练
备份最重要的不是备份本身,而是能否成功恢复。定期进行恢复演练,验证备份文件的完整性和可用性。建议每季度进行一次全量恢复测试,并记录恢复所需时间作为SLA参考。
▶八、异地容灾备份
将备份文件同步到异地机房或云存储,防止单点故障导致数据丢失。使用阿里云OSS、AWS S3或腾讯云COS作为备份目标,配置跨区域复制实现地理冗余。