news 2026/9/16 11:00:32

数据库专题25:备份与恢复演练——没有做过恢复,就不算有备份

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库专题25:备份与恢复演练——没有做过恢复,就不算有备份

数据库专题25:备份与恢复演练——没有做过恢复,就不算有备份

备份文件存在磁盘上,只能说明“复制成功”,不能说明系统能恢复。真正的目标是给博客项目定义 RPO(最多丢多少数据)和 RTO(多久恢复服务),然后分别对 PostgreSQL、MongoDB、Redis 做可重复的导出、破坏、恢复和校验。本篇所有命令都可在projects/database-platform的 Docker Compose 中练习。

上一篇练习讲解

上一篇的安全练习应创建blog_report只读账号、Redis ACL,并用注入字符串测试搜索。若测试失败,优先检查应用是否绕过 ORM 使用了字符串拼接;权限错误应在数据库端出现,而不是只依赖接口代码。备份也要使用专用只读账号,不能把管理员密码写入脚本。

1. 明确 RPO/RTO 和备份对象

本项目设定:文章和用户的 RPO 为 15 分钟、RTO 为 30 分钟;Redis 排行榜是可重建缓存,RPO 可为 24 小时。PostgreSQL 要做逻辑备份加 WAL/PITR,MongoDB 保存文章版本和审计,需保留时间点;Redis 只备份持久计数,普通缓存不必恢复。

PostgreSQL 业务事实 ── pg_dump + WAL ──> 对象存储 MongoDB 版本/审计 ─── mongodump ──> 加密归档 Redis 持久计数 ────── BGSAVE/导出 ──> 可选 ↓ 每月进行一次“破坏后恢复”演练

2. PostgreSQL 逻辑备份

先在容器内生成自定义格式备份。密码通过环境变量传递,避免出现在命令历史:

$env:PGPASSWORD ="blog"docker compose exec-T postgres pg_dump-U blog-d blog-Fc>.\backup\blog-$(Get-Date-Format yyyyMMdd-HHmm).dump

自定义格式支持并行恢复和选择性恢复;如果只需要 schema,可使用--schema-only。备份完成后检查文件大小和目录清单:

pg_restore-l.\backup\blog-latest.dump|Select-Object-First 12 pg_restore--list.\backup\blog-latest.dump|Select-String"TABLE DATA"

恢复到临时数据库,不要直接覆盖生产库:

docker compose exec-T postgres createdb-U blog blog_restoreGet-Content.\backup\blog-latest.dump-AsByteStream|docker compose exec-T postgres pg_restore-U blog-d blog_restore--clean--if-exists docker compose exec-T postgres psql-U blog-d blog_restore-c"select count(*) from articles;"

验证行数、关键用户、文章版本和约束。恢复成功后再切换连接串或进行逻辑复制,不能只看到pg_restore返回 0 就宣布完成。

3. MongoDB 文章版本与审计备份

New-Item-ItemType Directory-Force.\backup\mongo|Out-Nulldocker compose exec-T mongo mongodump--db blog--archive--gzip >.\backup\mongo\blog.archive.gz

恢复到隔离数据库进行比对:

Get-Content.\backup\mongo\blog.archive.gz-AsByteStream|docker compose exec-T mongo mongorestore--archive--gzip--nsFrom='blog.*'--nsTo='blog_restore.*'--drop docker compose exec-T mongo mongosh--quiet--eval"db.getSiblingDB('blog_restore').article_versions.countDocuments({})"

生产副本集可使用--oplog保证导出期间的一致时间点;大集合恢复时注意磁盘和索引重建时间。审计集合涉及合规,备份文件必须加密并限制读取角色。

4. Redis 备份的边界

Redis 的缓存 key 可以在 PostgreSQL/Mongo 恢复后重建。若排行榜计数还没落库,使用 AOF 或 RDB 作为短期补救:

docker compose exec redis redis-cliBGSAVE docker compose exec redis redis-cliLASTSAVE docker compose exec redis redis-cli--user blog_app--pass change-me-redis GET blog:article:42:views

不要把dump.rdb当作跨版本长期备份;恢复 Redis 后先让应用以只读降级启动,确认 key 命名空间和 TTL,再开放写流量。敏感 session 应设置短 TTL,恢复旧 session 可能带来账号安全问题。

5. 破坏与恢复实验

在测试环境插入标记数据:

insertintoarticles(title,body,author_id,status)values('restore-check','backup marker',1,'published');

记录当前时间和三类数据库行数,然后删除restore-check,再从备份恢复到临时库。验收脚本示例:

importpsycopgdefassert_restore(dsn:str)->None:withpsycopg.connect(dsn)asconn:row=conn.execute("select title, body from articles where title=%s",("restore-check",)).fetchone()assertrow==("restore-check","backup marker")

如果恢复后缺少该行,说明备份时间晚于插入或备份文件路径错误。若行存在但外键失败,检查恢复顺序和--disable-triggers的使用范围;不要为了让命令成功而永久禁用约束。

6. 自动化与保留策略

备份脚本应输出成功/失败、耗时、文件大小、校验和,并在失败时告警。保留策略可以是每日 7 份、每周 4 份、每月 12 份;删除旧备份前确认最新一份已经通过恢复抽检。对象存储启用版本控制和服务端加密,下载恢复时使用临时凭证。

验收记录

pg_dump blog-latest.dump -> 文件可由 pg_restore -l 读取 blog_restore articles 行数 = 原库行数,restore-check 存在 mongorestore blog_restore.article_versions = 原集合数量 Redis BGSAVE 返回 Background saving started 恢复演练从停止写入到校验通过耗时 6 分钟,满足 RTO 30 分钟

课后练习

backup.ps1:创建带日期的目录,导出 PostgreSQL/MongoDB,计算 SHA-256 并输出 JSON 报告;写restore-check.ps1自动创建临时库并验证标记数据。报告中记录 RPO/RTO,下一篇使用这些数据做慢查询和压测基线。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 10:59:18

新型2T增益单元存储器技术:低刷新能耗与高可靠性突破

1. 新型低刷新能耗增益单元存储器技术解析在半导体存储器领域,功耗与性能的平衡一直是工程师们面临的重大挑战。最近斯坦福大学与台积电联合研发的新型2T增益单元存储器技术,通过创新的界面偶极子调控方法,实现了刷新能耗的大幅降低。这项技术…

作者头像 李华
网站建设 2026/9/16 10:59:12

2026年AI论文写作工具现状与高校推荐TOP5

1. 2026年AI论文写作工具现状解析 最近两年AI写作辅助工具呈现爆发式增长,根据Nature最新调研显示,86%的研究人员承认在论文写作过程中使用过某种形式的AI工具。但高校和科研机构对此态度微妙——官方文件往往禁止AI代写,私下却有不少导师会…

作者头像 李华
网站建设 2026/9/16 10:58:16

雷达信号检测门限与CFAR:从NP准则到MATLAB实现

简介:雷达信号检测与检测门限确定是雷达系统从噪声中提取目标的关键环节。这套MATLAB源码资源面向雷达信号处理学习者与科研人员,围绕MTI多目标消除、多普勒滤波器组频率分析以及CFAR恒虚警率处理三大核心模块展开,既有原理梳理,也…

作者头像 李华
网站建设 2026/9/16 10:56:38

翻转二叉树:LeetCode热题解析与实现

1. 理解翻转二叉树问题翻转二叉树是LeetCode热题HOT 100中的第226题,难度标记为简单,通过率高达82.5%。这道题要求我们将给定的二叉树进行左右翻转,也就是将每个节点的左右子树互换位置。这个问题最初由计算机科学家Max Howell(Ho…

作者头像 李华