Docs 菜单

Docs 主页开发应用程序MongoDB Manual

从 MongoDB 备份恢复副本集

在此页面上

  • 将数据库恢复到单节点副本集
  • 向副本集添加成员

此程序概述了获取 MongoDB 数据并将此数据恢复到新副本集的过程。使用此方法从生产备份进行数据库填充测试部署,或作为灾难恢复的一部分。

重要

您还可以使用 mongorestore来使用通过mongodump创建的数据来恢复数据库文件。有关更多信息,请参阅使用 MongoDB 工具进行备份和恢复

1

备份文件可能来自文件系统快照MongoDB Cloud Manager存储的快照时间点快照生成 MongoDB 数据库文件。对于Ops Manager(MongoDB Enterprise Advanced 中提供的本地部署解决方案) ,另请参阅Ops Manager 备份概述。

加密存储引擎注意事项
对于使用 AES256-GCM 加密模式的加密存储引擎AES256-GCM 要求每个进程使用带有键的唯一计数器区块值。对于使用 AES256-GCM 密码配置的加密存储引擎
  • 从热备份恢复
    从 4.2 开始,如果从通过“热”备份(即 mongod 正在运行)获取的文件进行恢复,MongoDB 可以在启动时检测到“脏”密钥,并自动滚动更新数据库密钥以避免重用 IV(初始化向量)。
  • 从冷备份恢复

    不过,如果从通过“冷”备份(即 mongod 未运行)获取的文件进行恢复,MongoDB 无法在启动时检测到“脏”密钥,重用 IV 将导致机密性和完整性保证失效。

    从 4.2 版开始,为了避免从冷文件系统快照恢复后重用密钥,MongoDB 添加了一个新的命令行选项 --eseDatabaseKeyRollover。使用 --eseDatabaseKeyRollover 选项启动时,mongod 实例会滚动使用 AES256-GCM 密码配置的数据库密钥并退出。

提示

  • 一般来说,如果对 MongoDB Enterprise 4.2+ 使用基于文件系统的备份,请尽可能使用“热”备份功能。

  • 对于 MongoDB Enterprise 版本 4.0 及更早版本,如果您使用 AES256-GCM 加密模式,请复制数据文件或从文件系统快照(“热”快照或“冷”快照)进行恢复。

2

如果您要从文件系统备份(或任何带有 local 数据库的备份)进行恢复,请删除 local 数据库。

您还必须指定创建快照时使用的相同启动选项

mongod --dbpath /data/db <startup options>

mongosh连接到mongod实例并删除local数据库。

use local
db.dropDatabase()

关闭独立运行。

3

mongod 实例作为新的单节点副本集启动。使用 --dbpath 选项指定备份数据文件的路径,并使用 --replSet 选项指定副本集名称。对于配置服务器副本集 (CSRS),请包含 --configsvr 选项。包括适合您部署的任何其他选项。

您还必须指定创建快照时使用的相同启动选项

注意

如果您的副本集节点在不同的主机上运行,或者您希望远程客户端连接到您的实例,则必须指定net.bindIp设置(或--bind_ip )。

警告

在绑定到非本地主机(例如可公开访问)的 IP 地址之前,请确保您已保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅安全检查清单。至少应考虑启用身份验证强化网络基础架构。

mongod --dbpath /data/db --replSet <replName> <startup options>

注意

3.6 版本中的新增功能:

所有 MongoDB 集合默认都有 UUID。MongoDB 恢复集合时,恢复的集合保留其原始 UUID。恢复不存在 UUID 的集合时,MongoDB 会为恢复的集合生成一个 UUID。

有关集合 UUID 的更多信息,请参阅集合

4

从运行mongod之一的同一台计算机(在本教程中为mongodb0.example.net )启动mongosh 。要连接到在默认端口27017上侦听本地主机的 { mongod },只需发出以下命令:

mongosh

根据您的路径,您可能需要指定mongosh二进制文件的路径。

如果mongod未在默认端口上运行,请为mongosh指定--port选项。

5

对副本集的一个且仅一个成员使用 rs.initiate()

rs.initiate( {
_id : <replName>,
members: [ { _id : 0, host : <host:port> } ]
})

MongoDB 会启动一个由当前成员组成并使用默认副本集配置的集合。

MongoDB 提供了两个用于恢复副本集从节点成员的选项:

注意

如果数据库很大,初始同步可能需要很长时间才能完成。对于大型数据库,最好将数据库文件复制到每个主机。

使用以下操作序列,通过直接复制 MongoDB 数据文件,将还原的数据“填充”副本集的其他成员。

1

使用 --shutdowndb.shutdownServer() 确保完全关闭。

2

主成员的数据目录复制到副本集其他成员的 dbPath 中。

3
4

在连接到 主mongosh 节点的 会话 rs.add() ,使用 方法将从节点添加到副本集。有关 部署副本集 的更多信息,请参阅部署副本集。

使用以下操作序列,使用默认的初始同步操作,将还原的数据作为副本集其他成员的“填充器”。

1

例如,如果副本集成员具有 /data/dbstorage.dbPath--dbpath,则必须确保该目录存在为空。

2
3

使用 mongo shell 连接到主成员,并使用 rs.add() 将每个辅助成员添加到副本集。

在您将成员添加到副本集时,初始同步会将数据从主成员复制到新成员。

← 使用 MongoDB 工具进行备份和恢复