服务器备份策略制定:从零搭建可恢复的备份方案
备份不是把文件复制一份就结束,而是要保证数据丢失时能恢复回来。
本文面向零基础用户,讲清服务器备份策略制定的完整流程:先确定备份什么,再选工具和存放位置,接着设置定时任务,最后做恢复验证。
先明确备份对象和恢复目标
动手写脚本前,先回答两个问题:哪些数据丢了会影响业务,以及能接受丢失多长时间的数据。
- 必须备份:网站程序目录、数据库、Nginx/Apache 配置文件、SSL 证书、计划任务和用户上传文件。
- 可以不备份:系统缓存、日志(除非有审计需求)、临时目录、可重新安装的依赖包。
- 恢复目标参考:个人博客通常允许丢失一天数据;订单类业务需要更短间隔,可能要做数据库实时同步。
建议用表格列出每个目录或数据库的路径、大小、备份频率和保留天数,这份清单就是后续脚本的依据。
选择备份方式与存放位置
对单台服务器,推荐“本地打包 + 异地传输”组合,兼顾速度和容灾。
- 本地备份:用
tar打包网站目录,用mysqldump导出数据库,速度快,恢复方便。 - 异地备份:通过
rsync或对象存储把压缩包传到另一台服务器或云存储,防止整机故障。 - 工具选择:个人站长用
tar、mysqldump、rsync、crontab即可;多台服务器可考虑restic、borgbackup等支持去重和加密的工具。
本地备份目录建议放在数据盘而非系统盘,例如 /data/backup。
异地目标可以是另一台服务器,也可以是兼容 S3 的对象存储。
编写可执行的备份脚本
下面是一个可直接修改使用的示例,保存为 /root/backup.sh。
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/data/backup"
DATE=$(date +%F)
WEB_DIR="/www/wwwroot/example.com"
DB_NAME="wordpress"
DB_USER="root"
DB_PASS="your_password"
mkdir -p "$BACKUP_DIR/db" "$BACKUP_DIR/web"
# 备份网站文件
tar -czf "$BACKUP_DIR/web/web_$DATE.tar.gz" -C "$(dirname $WEB_DIR)" "$(basename $WEB_DIR)"
# 备份数据库
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_DIR/db/db_$DATE.sql.gz"
# 删除 7 天前的本地备份
find "$BACKUP_DIR" -type f -mtime +7 -delete
给脚本执行权限:
chmod +x /root/backup.sh
先手动运行一次,确认没有报错并检查文件大小是否正常:
/root/backup.sh
ls -lh /data/backup/web /data/backup/db
设置定时任务与异地传输
用 crontab 每天凌晨执行备份:
crontab -e
加入一行:
0 2 * * * /root/backup.sh >> /var/log/backup.log 2>&1
异地传输可以用 rsync 推送到另一台服务器:
rsync -avz -e ssh /data/backup/ user@backup-server:/backup/example.com/
如果不方便维护第二台服务器,可使用对象存储命令行工具上传。
无论哪种方式,务必确认异地端能收到文件,只写脚本不检查结果等于没有备份。
常见坑与恢复验证
- 只备份不验证:定期从备份包解压一次,确认数据库能导入、网站能打开。
- 数据库密码写在脚本里:建议用
~/.my.cnf配置文件并设置600权限,避免密码泄露。 - 备份文件占满磁盘:保留策略要明确,本地保留 7 天、异地保留 30 天是常见做法,按数据量调整。
- crontab 环境变量缺失:脚本里使用绝对路径,命令找不到时检查
PATH。 - 备份期间写入冲突:数据库备份建议加
--single-transaction参数,减少锁表影响。
恢复验证步骤:
# 解压网站文件
tar -xzf web_2025-01-01.tar.gz -C /tmp/restore_test
# 导入数据库测试
zcat db_2025-01-01.sql.gz | mysql -uroot -p test_db
能成功解压并导入,说明备份文件可用。
建议每季度做一次完整恢复演练。
常见疑问
备份频率设多少合适? 看数据变化速度。
个人博客每天一次通常够用;
电商或论坛建议数据库每小时一次,文件每天一次。
本地和异地都要保留吗? 建议都保留。
本地用于快速恢复,异地用于整机故障或误删场景。
备份文件要不要加密? 如果传输经过公网或存放在第三方存储,建议加密,避免数据库内容泄露。
服务器备份策略制定没有统一答案,关键是先列清备份清单,再让脚本自动执行,最后用恢复测试证明它真的有效。
按本文步骤完成后,根据业务数据量调整频率和保留天数即可。