本文介绍如何取得 MongoDB 数据,并将其恢复到新的副本集。可以用生产备份初始化测试部署,也可以用于灾难恢复。
重要:不能把同一份数据分别恢复到三个新的 mongod 实例,再创建副本集。这样做会迫使从节点执行初始同步。本文的方法才是正确且高效的恢复副本集流程。
也可以使用 mongorestore,恢复由 mongodump 创建的数据。详情参阅“使用 MongoDB 工具备份和恢复”。
注意事项
备份是数据库在某个时刻的状态快照。从备份恢复后,数据库不包含备份创建之后的变化,因此可能丢失后续数据。
将数据库恢复到单节点副本集
1. 获取 MongoDB 数据库备份文件
备份文件可以来自文件系统快照。MongoDB Cloud Manager 可以为保存的快照及时间点快照生成 MongoDB 数据库文件。MongoDB Enterprise Advanced 提供的本地部署方案 Ops Manager,也有相应的备份概览文档。
加密存储引擎注意事项
使用 AES256-GCM 加密模式时,要求每个进程对同一密钥使用唯一的计数器块值。
如果加密存储引擎使用 AES256-GCM:
- 从热备份恢复:如果备份文件是在
mongod运行期间生成的,MongoDB 启动时会识别“脏”密钥,并自动轮换数据库密钥,避免重复使用初始化向量 IV。 - 从冷备份恢复:如果备份文件是在
mongod停止期间生成的,MongoDB 启动时无法识别“脏”密钥。IV 重用会破坏机密性与完整性保证。为避免从冷文件系统快照恢复后重用密钥,MongoDB 提供--eseDatabaseKeyRollover命令行选项。以此选项启动mongod,会轮换使用 AES256-GCM 的数据库密钥,然后退出。
2. 如果备份包含 local 数据库,删除它
从文件系统备份,或任何包含 local 数据库的备份恢复时,需要删除 local 数据库。
先使用备份数据文件作为数据路径,启动独立的 mongod。必须同时指定创建快照时使用的相同启动选项:
mongod --dbpath /data/db <startup options>
通过 mongosh 连接实例,删除 local 数据库:
use local
db.dropDatabase()
然后关闭这个独立实例。
3. 启动新的单节点副本集
启动 mongod,作为新的单节点副本集。用 --dbpath 指定备份数据路径,用 --replSet 指定副本集名称。配置服务器副本集(CSRS)还需要 --configsvr。根据部署情况加入其他选项。
必须保留创建快照时使用的相同启动选项。
注意:如果成员运行在不同主机,或者希望远程客户端连接实例,必须指定 net.bindIp 或 --bind_ip。
警告:绑定到可公开访问的 IP 前,必须防止未授权访问。完整建议见自管理部署安全清单;至少应考虑启用身份验证并加固网络基础设施。
mongod --dbpath /data/db --replSet <replName> <startup options>
注意:MongoDB 集合默认具有 UUID。恢复集合时会保留原有 UUID;如果被恢复集合原本没有 UUID,MongoDB 会生成一个。详情见集合文档。
4. 使用 mongosh 连接 mongod
在运行 mongod 的同一机器上启动 mongosh。本教程为 mongodb0.example.net。连接监听 localhost 默认端口 27017 的实例,只需运行:
mongosh
根据路径配置,可能需要指定 mongosh 二进制文件完整路径。如果 mongod 不在默认端口运行,给 mongosh 添加 --port。
5. 初始化新副本集
只在副本集的一个成员上执行一次 rs.initiate():
rs.initiate( {
_id : <replName>,
members: [ { _id : 0, host : <host:port> } ]
})
MongoDB 会创建只包含当前成员、使用默认副本集配置的新副本集。
向副本集添加成员
MongoDB 提供两种恢复从节点的方式:
- 手动把数据库文件复制到每个数据目录。
- 让初始同步自动分发数据。
注意:大型数据库的初始同步可能耗时很长,因此直接复制数据库文件到各主机可能更合适。
复制数据库文件并重启 mongod
通过直接复制 MongoDB 数据文件,为其他成员提供恢复数据:
- 关闭刚恢复的 mongod。使用
--shutdown或db.shutdownServer(),确保干净关闭。 - 将主节点数据目录复制到每个从节点。目标位置是其他成员的
dbPath。 - 重新启动刚恢复的 mongod。
- 将从节点加入副本集。在连接主节点的
mongosh会话中,使用rs.add()添加从节点。部署详情见自管理副本集部署文档。
使用初始同步更新从节点
通过默认的初始同步,为其他成员提供恢复数据:
- 清空每个候选成员的数据目录。例如
storage.dbPath或--dbpath为/data/db,就必须确保该目录存在且为空。 - 启动每个副本集成员。
- 添加每个候选成员。通过 mongo shell 连接主节点,使用
rs.add()添加每个从节点。成员加入后,初始同步会把主节点的数据复制到新成员。
原文:Restore a Self-Managed Replica Set from MongoDB Backups。作者/维护方:MongoDB 文档维护者。本文为中文翻译,代码及命令保留原文。











暂无评论内容