上个月一台云服务器的系统盘出了偶发只读故障,虽然最后通过快照恢复了,但当时心里确实悬了一下。之前为了省事,我一直把备份文件随手扔在服务器的本地目录里。一旦实例本身挂掉或者磁盘损毁,本地备份其实毫无意义。趁着这周给新服务器做初始化,把网站目录和 MySQL 数据库自动异地冷备到对象存储的流程重新梳理了一遍,记录一下目前在跑的配置。
1. 准备对象存储凭证与插件
异地备份通常选择各大云厂商的对象存储(例如腾讯云 COS、阿里云 OSS、七牛云等),通用 S3 兼容协议的存储桶也可以。配置思路完全一样:
- 在对象存储后台新建一个专门用于灾备的私有读写 Bucket,切忌设为公共读写。
- 创建权限最小化的子账号(AccessKey / SecretKey),只给这个 Bucket 的读写与删除权限,不要直接拿主账号的全局高权限密钥去服务器上配。
- 在宝塔面板的软件商店里安装对应的对象存储插件(例如“阿里云OSS”或“腾讯云COS”插件),把获取到的 Key、Bucket 名称和所在地域节点(Endpoint)填进去,点保存后测试下列表是否能正常拉取。
2. 备份周期与保留份数参考
备份并不是越频繁越好。每天打包一次几百兆的源码,既消耗服务器的 CPU 和磁盘 I/O,又白白浪费存储桶容量。静态文件不多的站点,源码变动频率远低于数据库,应该拆开处理。
| 站点类型 | 网站文件备份频率 | 数据库备份频率 | 保留份数建议 | 计划执行时间 |
|---|---|---|---|---|
| 个人博客 / 小型展示站 | 每周 1 次 | 每天 1 次 | 保留 7 份 | 凌晨 03:30 以后 |
| 中型内容站 / 社区 | 每 3-5 天 1 次 | 每天 1-2 次 | 保留 14 份 | 凌晨 04:00 以后 |
| 高频变动电商 / 业务系统 | 仅更新后手动/每周 | 每 6 小时增量/全量 | 保留 30 份 | 避开整点高峰 |
对于大部分日常更新不算激进的个人站点,数据库每天全量备份一次、保留 7-14 天即可;网站目录每周做一次归档完全足够。
3. 添加计划任务的具体设置
在宝塔面板的“计划任务”菜单中,建议将“备份网站”和“备份数据库”拆分成两个独立的任务:
- 任务类型:分别选择“备份网站”和“备份数据库”。
- 备份到:务必在下拉菜单中选中前面配置好的对象存储,而不是默认的“服务器磁盘”。
- 时间避峰:如果有多台机器或者多个站点,不要全部堆在整点(如 03:00)。可以错开几分钟,比如数据库设为 03:15,网站文件设为 03:45,避免两项任务同时压缩导致服务器瞬间负载过高。
- 保留数量:按照上面表格填入数值。宝塔在成功上传新包之后,会自动根据设定的份数清理对象存储桶里的历史旧包。
设置完成后,点击任务右侧的“执行”按钮手动跑一次,并在“日志”里确认是否出现上传成功的提示。
4. 几个容易踩坑的细节
- 本地临时目录空间:宝塔向对象存储传输数据时,逻辑是“本地先打包压缩 -> 上传到存储桶 -> 删除本地临时包”。这意味着你的云服务器本地磁盘,至少要留出等于网站文件压缩后大小的空闲空间。如果磁盘已经 95% 满载,备份任务会直接在打包阶段报错失败。
- 排除不必要的大文件:在网站备份高级设置里,可以把日志文件目录(如 runtime、logs)、缓存目录和本地旧的压缩包(.zip, .tar.gz)排除掉,没必要每次都把日志再打包传一遍。
- 定期做恢复演练:备份的真正目的是“能恢复”。每隔几个月,顺手把对象存储里的 SQL 包下载到本地测试环境导入一次,确保导出的数据没有因为表锁或编码异常变成空库。