建站备份方案:文件加数据库双保险

网站备份只备文件?数据库漏了等于白备。小够给你一套文件加数据库的双保险方案:命令行和面板两种做法,定时自动跑,出事能恢复。

我是小够。

见过太多站长:网站被黑、误删、商家跑路,哭着来问"能恢复吗",一问备份——“我备了文件,数据库忘了”。网站 = 文件 + 数据库,少一样都恢复不了,这是建站备份的第一课。

今天给一套最小可行的双保险方案,个人小站照抄就行,命令行和面板两种做法都讲。

备份什么:三样东西

1. 网站文件

WordPress 的 wp-content、Halo 的数据目录、静态站的 html 文件——总之是你上传、修改过的所有文件。系统文件不用备,重装就行。

2. 数据库

文章、评论、用户、配置,全在数据库里。只备文件不备数据库,恢复出来是个空壳。MySQL/MariaDB 用 mysqldump,SQLite 直接拷文件。

3. 配置文件

Nginx 配置、SSL 证书、定时任务(crontab)。这些东西重建起来最费时间,顺手一起打包。

做法一:命令行定时备份

手动备份等于没备份——你坚持不了一个月。用 cron 定时任务,每天凌晨自动跑:

# 每天凌晨 3 点备份网站文件
0 3 * * * tar -czf /backup/site-$(date +\%F).tar.gz /var/www/html

# 每天凌晨 3 点半备份数据库
30 3 * * * mysqldump -u root -p'你的密码' --all-databases | gzip > /backup/db-$(date +\%F).sql.gz

# 只保留最近 7 天的备份,自动删旧的
0 4 * * * find /backup -name "*.gz" -mtime +7 -delete

三行 cron,文件和数据库都有了,旧备份自动清理,硬盘不会爆。

异地同步再加一行:

# 每天凌晨 5 点同步到另一台机器
0 5 * * * rsync -az /backup/ 用户@另一台IP:/backup/

做法二:面板一键备份

用宝塔、1Panel 的,点点鼠标就行:

  • 宝塔:计划任务 → 添加"备份网站"“备份数据库”,设置执行周期(每天一次)、保留份数,备份路径可以选远程存储。
  • 1Panel:计划任务 → 创建备份任务,网站和数据库分开建,支持备份到本地或对象存储。

面板的好处是可视化,坏处是换面板就得重配。命令行脚本的好处是通用,走到哪都能用。小够建议:面板用户也看一眼命令行做法,技多不压身。

存哪:异地是底线

备份存在同一台机器上,机器挂了备份一起挂——这叫"假备份"。至少做到异地一份:

  • 传到另一台 VPS(rsync 一把梭)
  • 传到对象存储(R2、OSS、S3 都行,便宜,一个月几块钱)
  • 传到家里的 NAS 或电脑

小够的建议:本地一份 + 异地一份。异地那份可以频率低一点(一周一次),关键时刻能救命就行。

对象存储配置一次就行:建个 bucket,拿个 API 密钥,用 rclone 或面板自带的对象存储备份功能,定时同步。rclone 配好后,一条命令就能同步:

rclone sync /backup/ remote:my-bucket/backup/

多久备一次

  • 个人博客:每天一次,保留 7 天
  • 有收入的站:每天一次,保留 30 天,数据库可以每小时增量
  • 几乎不更新的静态站:一周一次足够

备份频率和你的更新频率挂钩:一天写三篇文章,就别一周备一次。

恢复步骤:提前写好

备份的另一半是恢复,步骤提前写成文档:

  1. 新机器装好环境(Nginx、PHP、MySQL,版本尽量和原来一致)
  2. 解压网站文件到对应目录,改好权限
  3. 新建数据库,导入 sql 备份
  4. 恢复 Nginx 配置和 SSL 证书
  5. 打开网站,前后台都点一点验证

光写不行,要演练。拿一份备份在新机器上真的恢复一遍,详见我写的《灾难恢复演练》。

备份频率进阶:增量备份

每天全量备份,硬盘吃不消?上增量:

  • 文件增量:rsync 只同步变化的文件,配合 --link-dest 做硬链接快照,7 天的备份只占 1 天多的空间
  • 数据库增量:开 binlog,每天全量 + 每小时增量,RPO 能压到 1 小时内

个人小站全量就够了,业务站再考虑增量。别为了"高级"把简单有效的方案搞复杂,够用主义同样适用于备份策略。

备份检查清单

对照着打勾:

  • 网站文件在备
  • 数据库在备(别漏!)
  • 配置文件、证书在备
  • 定时任务在跑(检查最近 3 天的备份文件日期)
  • 有异地备份
  • 备份文件能解压、数据库能导入
  • 做过一次恢复演练

小够的提醒

  1. 备份文件要加密或设权限:数据库里有用户信息,备份包 chmod 600,别谁都能读。
  2. 测试备份完整性:定时任务跑起来后,第一周手动检查几次,确认文件真的生成了、能解压。
  3. 面板用户也别偷懒:宝塔、1Panel 都有计划任务和备份功能,点点鼠标就能配好,没借口不备份。
  4. 换商家前先备份:迁移 VPS 时,完整备份是后悔药,迁移前先做一份全量。

不同建站程序的备份要点

WordPress

  • 文件:wp-content 目录(主题、插件、上传的图片)
  • 数据库:mysqldump 全库导出
  • 特别注意:wp-config.php 里有数据库密码,备份时别泄露

Halo

  • Halo 2.x 数据都在工作目录,整个目录打包就行
  • 用的是 H2 数据库的话,数据库文件也在工作目录里,一起打包
  • 升级 Halo 前先备份,跨版本升级翻车是常事

静态站(Hugo/Hexo)

  • 源文件(Markdown)和生成的 public 都备,源文件最重要
  • 丢了源文件,public 还能凑合用;丢了 public,源文件能重新生成
  • 这类站备份最简单,一个 git 仓库就搞定

数据库单独说一句

mysqldump 导出时加 --single-transaction,不锁表,网站不用停:

mysqldump -u root -p'密码' --single-transaction --all-databases | gzip > /backup/db-$(date +%F).sql.gz

备份不花钱,出事才花钱。每天凌晨三分钟的 cron,换来的是睡安稳觉——这买卖,值。