tencent cloud

云数据库 MongoDB

文档云数据库 MongoDB实践教程备份与回档策略指引

备份与回档策略指引

Download
聚焦模式
字号
最后更新时间: 2026-07-22 17:43:12
在生产环境中,数据丢失或损坏是数据库运维中需要重点防范的风险,常见的触发场景包括:
人为误操作:误执行 drop 命令删除数据库或集合;或使用空条件的 updateMany 覆盖了大量业务数据。
程序逻辑缺陷:应用代码 Bug 导致数据被错误写入或覆盖。
安全事件:未授权访问导致数据被恶意篡改或删除。
版本升级或架构变更:重大变更过程中出现异常,需要回滚到变更前状态。
针对上述场景,云数据库 MongoDB 提供三种粒度的回档方案:
克隆实例(实例级):基于备份文件恢复出一个完整的独立实例,适用于影响范围大或需要隔离验证的场景。
库表回档(库表级):将指定的数据库或集合恢复到原实例或新实例,适用于受损范围已明确到库或集合的场景。
按 Key 闪回(文档级):按 Key 精准恢复单个或少量文档到目标时间点,适用于文档级误操作的场景。
本文分别从回档前的备份选择回档方案选型回档后的验证与切换三个角度,介绍如何根据业务场景做出合适的判断。

一、备份选择

任何回档方案都依赖事前生成的备份文件。在发起回档之前,需要先确认两件事:当前实例采用的备份方式与回档目标兼容、目标时间点附近存在可用的备份文件。

1.1 数据备份

备份方式
实现方式
适用场景
局限性
逻辑备份
通过 mongodump 工具备份
跨版本恢复:恢复到与源实例不同版本的实例(例如4.0 → 5.0)
跨实例类型迁移:从云上迁移到自建、或不同云厂商之间的迁移
小数据量实例:数据量较小时,耗时差距不明显
备份和恢复速度较慢,耗时随数据量与文档数线性增长
备份过程对实例性能有一定影响
占用的存储空间相对较多
物理备份
直接复制存储引擎底层的物理文件(数据文件、索引文件、日志文件)
生产环境首选场景:本地盘4.0及以上版本实例,速度较快,对性能影响较小
大数据量实例:数据量越大,速度优势越明显
同版本恢复:相同 MongoDB 版本之间的回档或克隆
不支持跨版本恢复:与 MongoDB 版本绑定
仅4.0及以上版本支持
按 Key 闪回
持续记录指定集合每次 Insert/Update/Delete 操作发生前的文档状态(pre-image),存储到独立的闪回存储
核心业务表的文档级误操作保护
需要按单文档精准恢复的场景
必须提前开启,未开启的集合无法事后使用
仅支持 MongoDB 5.0、7.0、8.0版本
云盘快照备份
基于云硬盘快照能力,对存储层做秒级快照
云盘版(4.0+)实例的首选:备份速度较快,对实例性能影响较小
仅云盘版支持

1.2 全量备份与增量备份

备份体系由全量备份和增量备份两部分构成,理解其本质与协作方式,有助于在制定备份策略和评估回档时长时做出更准确的判断。
全量备份:某一时间点数据库的完整数据快照,是回档的起点基线,单独即可恢复出该时间点的实例。
增量备份:基于 oplog 的增量变更数据。内核在实例运行过程中持续产生 oplog 用于副本集同步,备份系统据此持续收集并保存对应区间的增量变更,形成可用于回档的增量备份。
属性
全量备份
增量备份
本质
某一时间点的完整数据快照
基于 oplog 的增量变更数据
生成方式
备份策略周期性触发,或用户手动触发
备份系统自动持续生成,无需单独触发
存储位置
腾讯云对象存储(COS)
腾讯云对象存储(COS)
在回档中的作用
提供回档起点基线
在基线之上补齐至目标时间点的变更
说明:
回档协作关系:全量备份提供"时间点基线",增量备份提供"基线之后到目标时间点之间的细粒度变更"。回档时系统的工作路径为:最近一次全量备份 + 该时间点之后至目标时间点的增量备份 → 恢复至目标时间点。整个过程由系统在回档时自动完成,用户仅需选择目标时间点,无需关心增量数据的收集与回放等内部细节。
备份策略建议:对绝大多数实例,建议采用周期性自动全量备份 + 增量备份组合;增量备份保留时长建议不小于全量备份保留时长,避免出现"全量备份在保留期内、但增量备份已过期"的回档窗口断档。对关键变更前后(如版本升级、批量数据订正),可叠加手动全量备份以增强容灾粒度。

1.3 重大变更前进行全量手动备份

手动备份的意义

回档耗时取决于最近一次全量备份与目标时间点之间的时间间隔:间隔越长,需要回放的 oplog 越多,回档耗时越长。
核心原则:在重大变更前主动触发一次手动全量备份,可将回档起点固定在变更前的最近时间点,一旦变更失败需要回滚,可显著缩短回档耗时

建议进行手动备份的场景

下列场景的共同特征是操作不可逆或影响范围大,一旦失败将影响大量数据或业务连续性。在操作前主动触发一次手动备份,可为回滚提供时间点贴近的备份基线。
场景类别
典型情形
风险特征
数据库重大变更
• 数据库版本升级(例如4.0 → 5.0)
• 分片键调整、扩缩容等架构变更
• 数据库参数大幅调整、副本集成员变更
变更涉及内核或集群拓扑层面,一旦失败影响整实例可用性
大批量数据操作
• 执行 updateManydeleteMany 等批量命令前
• 数据迁移脚本、数据清洗脚本上线前
• 大批量数据导入或合并操作前
单次操作影响文档数量大,逻辑错误难以通过 oplog 精准恢复
应用版本发布
• 涉及数据结构变更(新增字段、修改字段类型)的应用迭代
• 涉及业务逻辑重大变化的大版本发布
• 灰度发布前的全量数据快照
应用层 Bug 可能持续写入错误数据,回滚需要明确的时间点基线
业务关键时点
• 大促、活动、跨年结算等业务高峰前
• 季度、年度结算前的数据快照
业务高峰期回档窗口短,需要预先准备贴近基线
详细操作,请参见 手动备份

二、回档方案的选型与说明

选择回档方案时,根据数据受损范围匹配相应粒度的方案:受损范围为少量文档时使用按 Key 闪回,受损范围为完整库或集合时使用库表回档,受损范围覆盖整个实例或多个核心库时使用克隆实例。若未提前开启按 Key 闪回,可使用库表回档生成 _bak 集合,再从中提取所需的目标文档合并写回。

2.1 回档方案速览

维度
按 Key 闪回(文档级)
库表回档(库表级)
克隆实例(实例级)
回档原理
基于闪回 Key(默认为 _id)快速检索目标时间点的文档状态,生成回档集合。
基于已有的备份文件,将指定的数据库或集合恢复到原实例(创建带 _bak 后缀的新集合)或新实例。
基于已有的备份文件,将数据克隆到一个全新的、独立的数据库实例中。
回档粒度
单文档
库或集合
整个实例
典型场景
文档级误操作,受影响的 Key 范围明确、可逐一列出
受损范围明确到库或集合
影响范围大或边界不清,需要隔离验证
回档产物
闪回集合 + 缺失记录集合
_bak 后缀新集合
独立的新实例
切换方式
数据合并写回原集合
批量改表名(原表加 _ori 后缀)
IP 交换
前提条件
实例版本5.0、7.0或8.0;目标集合已提前开启闪回

2.2 按 Key 闪回

下列场景的共同特征是受影响的文档数量较少(通常在100条以内),涉及敏感数据,线上业务影响大且需快速修复,可通过 _id 或其他索引字段精准定位每条受影响的记录:
程序 Bug 导致少量订单的状态字段被错误更新(例如 status"paid" 变为 "cancelled")。
用户投诉个别账户数据异常,已定位到具体的 userId 列表。
线上游戏用户误删装备,或因盗号导致装备受损,且已知受影响的用户 ID 或装备 ID。

具体操作

根据已知的受影响记录 ID(如用户 ID、商品 ID)和故障发生前的正确时间点,在控制台提交闪回任务。具体操作,请参见 按 Key 闪回

回档后的处理流程

发起按 Key 闪回后,系统仅会生成包含历史快照的临时集合(闪回集合与缺失记录集合),线上的原业务数据不会被自动修改或覆盖。您需要手动比对数据,并通过命令将正确的历史记录批量写回原表。具体的操作步骤,请参见 批量更新数据示例

2.3 库表回档

下列场景的共同特征是受损范围已明确到库或集合级别,其他库表数据正常,无需对整实例回档:
误执行 db.orders.drop() 删除了订单集合,但其他库表数据正常。
配置中心表(例如 config_center)被错误批量更新,但用户行为表不受影响。
数据迁移脚本异常导致某几个业务库的数据错乱,其他库正常。
多个实例的相同配置表被同一错误脚本污染,需要批量回档。

具体操作

根据已知的受损库表范围和故障发生前的时间点,在控制台提交回档任务。支持在单实例内执行库表回档(单次上限2000个库表),或勾选多个实例进行批量回档。详细步骤请参见官方文档:库表回档批量回档

回档后的处理流程

发起回档后,系统仅会生成带有 _bak 后缀的临时集合,线上原业务数据不会被自动修改。您需要通过以下流程完成最终数据修复:
1. 数据核对:在 mongosh 中抽查 _bak 集合的文档数量与关键字段,确认数据状态符合预期。
2. 整表切换(控制台批量改表名):若需整表恢复,直接在控制台利用“批量改表名”功能,将原表更名留作备份,并将 _bak 表秒级重命名为原表名完成切换。具体操作,请参见 批量回档
3. 精细合并(命令行手动处理):若仅需恢复部分文档,可通过脚本遍历 _bak 集合,利用 updateOne 配合 upsert: true 将指定记录精准写回或替换至原集合。

2.4 克隆实例

下列场景的共同特征是影响范围大或边界不清晰,在生产实例上直接操作存在放大影响的风险,需要一个与生产环境完全隔离的回档载体:
应用新版本上线后发现严重 Bug,大量核心业务表(订单、用户、支付)数据被错误覆盖,影响范围难以快速界定
实例遭遇安全事件(例如数据被恶意加密、删除或篡改),需要在不污染当前实例的前提下恢复完整数据。
版本升级后出现兼容性问题,需要回滚到升级前的整实例状态。
需要基于历史数据搭建独立的测试或灰度环境,对复杂变更进行预演验证。

具体操作

克隆实例独立计费,按标准资费收取。具体操作,请参见 克隆实例

回档后的处理流程

1. 在克隆实例上验证数据完整性(数据量、关键字段、索引、时间点准确性)。
2. 验证无误后,通过控制台切换网络功能完成 IP 交换。
3. 在控制台为原实例的 IP 设置 IP 保留期(默认24小时),待业务在新实例上稳定运行后再释放原 IP。保留期内若新实例出现异常,可通过将业务重新指向原 IP 快速回滚,回滚成本较低。

三、回档后的数据验证与业务切换

回档任务完成只是数据恢复的第一步,业务恢复成功还需要经过数据验证与流量切换两个环节

3.1 数据验证要点

切换前应至少从以下维度逐项核对:
验证维度
验收标准
文档数量
关键集合的文档数量与预期时间点的数据量一致
关键字段
抽查核心业务字段,内容恢复到预期时间点的状态
索引完整性
索引列表、类型(如单键、复合、TTL 索引)、字段与目标时间点一致。
时间点准确性
确认目标回档时间点的数据正常恢复
业务逻辑
核心业务状态、文档属性、集合间关联 ID 符合业务规则,无数据状态错乱、引用失效(如产生孤立文档、数据断链)等逻辑异常。
应用连通性
使用应用账号能正常读写,关键接口的业务链路正常

3.2 业务切换原则

小范围验证:切换后优先允许内部测试账号访问,确认核心链路正常后再全量开放。
保留原实例:切换完成后,保留原实例一段时间作为异常回滚的备选。
业务低峰执行:优先在业务低峰期执行切换,降低影响范围。
准备回滚预案:明确切换后若发现新问题,如何快速回切到切换前状态。

四、常见误区

误区
实际情况
"有自动备份就够了,不需要手动备份"
重大变更前进行手动备份,可使回档起点贴近变更前,显著缩短回档耗时
“有了按 Key 闪回,普通备份能力就不需要了”
按 Key 闪回仅在回档少量数据时建议使用,大规模数据恢复时采用传统回档方式效率更高。
"库表回档会覆盖原数据"
库表回档生成 _bak 后缀的新集合,原数据保留
"回档任务完成即恢复成功"
仍需经过数据验证、业务切换、观察期,才算完整恢复

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈