数据安全 / 已完成

数据库备份、迁移和恢复

理解数据库备份、恢复演练、生产迁移、危险改表和数据回滚策略。

返回文章积累

一句话:数据库备份、迁移和恢复就是保护项目最重要的数据资产,让你在改表、误删、服务器故障时还有办法救回来。

本篇学完你会什么:知道为什么备份不等于安全,迁移前要检查什么,恢复流程怎么演练,以及生产数据库变更为什么要分阶段。

1. 数据库为什么是系统的命根子

代码坏了,可以重新部署。

服务器坏了,可以重新创建。

但数据库里的用户、订单、文章、配置、权限如果丢了,很多时候不是重新发版就能解决。

常见事故:

事故结果
手误删除数据用户记录丢失
错误迁移脚本表结构坏了
没有 where 的 update大量数据被改错
磁盘损坏数据库不可用
备份没测试真要恢复时发现不能用

所以要记住一句话:

没有验证过的备份,不算真正的备份。

2. 备份有哪些类型

全量备份

把整个数据库备一份。

优点:

恢复简单
适合小项目

缺点:

数据越大越慢
占空间

增量备份

只备上次之后变化的数据。

优点:

节省空间
适合数据量大

缺点:

恢复流程更复杂

逻辑备份

导出 SQL 或结构化数据。

PostgreSQL 常见:

pg_dump -h localhost -U app -d appdb -f backup.sql

这个命令导出的是单个数据库的普通 SQL 文件,适合入门理解和小项目演练。

它不等于“整个数据库服务器都备份好了”。如果你的系统依赖角色、权限、扩展、定时任务等全局对象,需要另外记录,或者用 pg_dumpall --globals-only 导出全局对象。数据量变大后,也可以考虑 pg_dump -Fc 生成自定义格式,再用 pg_restore 恢复。

物理备份

备数据库底层文件或使用数据库专门的备份机制。

生产大库更常见,但对初学者来说,先理解逻辑备份和恢复就够用。

3. 备份要检查什么

备份不是“命令跑完”就结束。

要检查:

检查项为什么
备份文件是否生成防止任务根本没跑
文件大小是否合理防止导出空文件
是否加密防止备份泄漏
是否上传到安全位置防止机器坏了备份也没了
是否定期清理旧备份防止磁盘爆满
是否能恢复最关键

先认识两个词:

名词大白话
RPO最多能接受丢多久的数据,比如 5 分钟或 1 天
RTO最多能接受多久恢复服务,比如 30 分钟或 4 小时

下面只是一个小项目的简单备份策略,不是所有生产系统的标准答案:

每天一次全量备份
保留最近 7 天
每周保留一个月度备份
备份上传到独立存储
每月至少恢复演练一次

4. 迁移前要做什么准备

改表前先问 6 个问题:

这次改动会影响哪些表?
表里有多少数据?
会不会锁表?
代码是否兼容新旧结构?
失败后怎么回滚?
迁移前有没有备份?

Alembic 迁移脚本也要人工看一遍。

自动生成的脚本不一定完全安全,特别是:

变更风险
删除字段数据丢失
改字段类型转换失败或锁表
新增非空字段旧数据没有值
大表加索引可能耗时很长
重命名字段代码兼容问题

5. 生产改表怎么更安全

新增字段

比较安全:

先加 nullable 字段
代码开始写新字段
补历史数据
确认都有值
最后再改成 not null

删除字段

不要一步删。

更安全的流程:

代码先不读这个字段
观察一段时间
确认没有地方使用
备份
再删除字段

字段改名

字段改名看起来简单,其实容易影响代码。

稳一点:

新增 new_name
代码同时写 old_name 和 new_name
迁移历史数据
代码只读 new_name
最后删除 old_name

6. 恢复演练怎么做

恢复演练不是在生产库上试。

可以这样做:

  1. 准备一个空测试数据库。
  2. 找最近一次备份文件。
  3. 把备份恢复进去。
  4. 跑关键 SQL 检查数据量。
  5. 启动应用连这个恢复库。
  6. 打开登录、列表、详情等关键页面。

PostgreSQL 逻辑恢复示例:

createdb -O app appdb_restore
psql -d appdb_restore -f backup.sql

执行前先确认 appdb_restore 不存在,避免覆盖已有恢复库。恢复完成后,也要确认应用连接的是恢复库,而不是误连生产库。

恢复后检查:

SELECT count(*) FROM users;
SELECT count(*) FROM roles;
SELECT count(*) FROM user_roles;

大白话:备份像降落伞,不是背在身上就行,要确认真能打开。

7. 常见错误

错误后果修正
只备份不恢复测试真出事时发现备份坏了定期恢复演练
备份放在同一台机器机器坏了备份也丢放独立存储
迁移前不备份脚本失败难恢复先备份再迁移
大表随便加索引生产变慢或锁表评估耗时,低峰执行
一步删除字段回滚困难分阶段删除
备份文件不加密数据泄漏加密和权限控制

8. 检查清单

[ ] 有定期备份任务
[ ] 明确 RPO 和 RTO
[ ] 备份文件不在同一台机器
[ ] 备份有保留策略
[ ] 备份包含结构和数据
[ ] 定期做恢复演练
[ ] 迁移脚本人工 review
[ ] 危险迁移已拆成多步
[ ] 迁移前有最新备份
[ ] 回滚或修复方案写清楚

9. 小结

名词大白话
备份给数据留一份可恢复副本
恢复把备份重新变成可用数据库
迁移修改数据库表结构
回滚改坏后退回或修复
锁表表被操作卡住,其他请求受影响
恢复演练提前确认备份真的能救命

上一篇建议:先看《后端安全加固实战》。

下一篇建议:继续看《接口契约、版本管理和文档》,把前后端长期协作管住。