网站备份策略全解析:别等到数据丢失才后悔
服务器硬盘会坏、误操作会删库、黑客会入侵勒索。数据备份不是锦上添花而是刚需。我见过太多站长在数据丢失后才想起备份这件事,那时候为时已晚。
1. 3-2-1备份原则
业界公认的黄金法则:
- 3份数据副本(1份主数据+2份备份)
- 2种不同的存储介质(本地磁盘+云存储/外置硬盘)
- 1份异地备份(物理上远离主数据所在位置)
对于个人站长,最低配置:服务器本地一份(快速恢复)+ 云存储一份(防范服务器物理损坏)。预算允许再加一个不同云服务商的冷备。
2. 数据库备份
MySQL备份最常用的工具是mysqldump:
# 备份单个数据库
mysqldump -u root -p --single-transaction --quick mydb | gzip > backup_$(date +%Y%m%d).sql.gz
# 备份所有数据库
mysqldump -u root -p --all-databases --single-transaction | gzip > all_dbs_backup.sql.gz--single-transaction确保InnoDB表的一致性备份(不锁表),--quick防止大表备份时内存溢出。
对于大型数据库(超过1GB),用Percona XtraBackup做热备份,不锁表且增量备份速度快:
xtrabackup --backup --target-dir=/backup/full
xtrabackup --backup --target-dir=/backup/inc --incremental-basedir=/backup/full3. 文件备份
网站文件用rsync做增量同步:
rsync -avz --delete /var/www/ user@backup-server:/backup/www/--delete让备份端删除源端已删除的文件,保持完全一致。
对于WordPress/Typecho的uploads目录,通常不需要版本控制,用rclone直接同步到云存储:
rclone sync /var/www/usr/uploads remote:bucket-name/uploads4. 自动化备份脚本
把所有步骤写成一个脚本,加入crontab定时执行:
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 数据库备份
mysqldump -u root --single-transaction mydb | gzip > $BACKUP_DIR/db.sql.gz
# 文件备份
rsync -avz /var/www/ $BACKUP_DIR/files/
# 同步到云存储
rclone sync $BACKUP_DIR remote:bucket-name/daily/
# 清理7天前的本地备份
find /backup/* -maxdepth 0 -mtime +7 -exec rm -rf {} \;crontab设置每天凌晨3点执行:
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&15. 备份恢复演练
备份的价值在于能恢复。每月至少做一次恢复演练:
# 模拟灾难恢复
docker run -d --name test-recovery -v /tmp/restore:/backup alpine
# 导入数据库
gunzip < /backup/db.sql.gz | mysql -h test-db mydb
# 验证数据完整性
mysql -h test-db -e "SELECT COUNT(*) FROM posts"不经过演练的备份只是心理安慰。只有实际恢复成功过,才能放心地在生产环境出问题时不慌。
6. 增量备份节省存储成本
全量备份每天做太占空间。组合策略:每周日全量备份,周一至周六增量备份:
# 周日全量
mysqldump --all-databases > /backup/full_$(date +%Y%m%d).sql
# 其他日增量(利用binlog)
mysql -e "FLUSH LOGS"
cp /var/lib/mysql/mysql-bin.* /backup/incremental/恢复时先导入最近的全量备份,再按顺序应用增量备份的binlog。
花半天时间搭好备份系统,换来的是任何时候都不怕数据丢失的底气。这半天时间可能是你今年回报率最高的投资。