Level 41 / 阅读练习
数据库备份、迁移和恢复
理解数据库备份、恢复演练、生产迁移、危险改表和数据回滚策略。
Progress
阅读中
0/2 步完成 / 阅读后完成练习才算通关
Practice
本关怎么过
- 读完正文后确认完成阅读
- 完成 1 道选择题练习
- 答错时看解释,再回到正文补理解
一句话:数据库备份、迁移和恢复就是保护项目最重要的数据资产,让你在改表、误删、服务器故障时还有办法救回来。
本篇学完你会什么:知道为什么备份不等于安全,迁移前要检查什么,恢复流程怎么演练,以及生产数据库变更为什么要分阶段。
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_name6. 恢复演练怎么做
恢复演练不是在生产库上试。
可以这样做:
- 准备一个空测试数据库。
- 找最近一次备份文件。
- 把备份恢复进去。
- 跑关键 SQL 检查数据量。
- 启动应用连这个恢复库。
- 打开登录、列表、详情等关键页面。
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. 小结
| 名词 | 大白话 |
|---|---|
| 备份 | 给数据留一份可恢复副本 |
| 恢复 | 把备份重新变成可用数据库 |
| 迁移 | 修改数据库表结构 |
| 回滚 | 改坏后退回或修复 |
| 锁表 | 表被操作卡住,其他请求受影响 |
| 恢复演练 | 提前确认备份真的能救命 |
上一篇建议:先看《后端安全加固实战》。
下一篇建议:继续看《接口契约、版本管理和文档》,把前后端长期协作管住。
Checkpoint
读完后做题闯关
先读正文,再用下面的选择题检查自己是否真的理解。答错会出现解释,可以回到正文补一眼再重选。
读完正文后点击“我已读完,进入练习”,题目会变成可答状态。