使用 MongoDB 工具备份和恢复自管理部署
本教程描述了使用命令行实用程序创建备份和恢复数据的过程mongorestore
和 mongodump
是 MongoDB 提供的工具。
要恢复您的自托管部署的备份到托管的 MongoDB Atlas 部署,请参阅 使用 mongorestore 进行初始化。
对于全托管备份方法,请使用 MongoDB Atlas 中的 云备份,它使用集群云服务提供商的本地快照功能进行备份存储。
注意事项
部署
mongorestore
和 mongodump
工具与BSON 数据转储,对于创建小型部署的备份很有用。为了实现弹性且不中断的备份,请使用 文件系统快照 或与 MongoDB Atlas 的 云备份 一起进行块级磁盘快照。
注意
使用 MongoDB Atlas 备份分片集群
要使用 mongodump
和 mongorestore
作为分片集群的备份策略,请参阅 使用数据库转储备份自管理的分片集群。
分片集群还可以使用以下协调的备份和恢复过程之一,这些过程保持跨分片的事务原子性保证
性能影响
由于 mongodump
和 mongorestore
通过与正在运行的 mongod
实例交互来操作,因此可能会影响您运行数据库的性能。这些工具不仅为运行中的数据库实例创建流量,而且迫使数据库通过内存读取所有数据。当 MongoDB 读取不经常使用的数据时,它可能会驱逐更多频繁访问的数据,从而降低数据库常规工作负载的性能。
在用 MongoDB 的工具备份您的数据时,请考虑以下指南
为文件标记标签,以便您可以识别备份的内容以及备份反映的时间点。
如果
mongodump
和mongorestore
对您用例的性能影响不可接受,请使用其他备份策略,例如 文件系统快照 或 MongoDB Atlas 中的 云备份。为确保
mongodump
可以对副本集进行一致性的备份,您必须使用--oplog
选项来捕获备份操作期间接收到的写入,或者在整个备份期间停止对副本集的所有写入。有关分片集群副本集的信息,请参阅 使用数据库转储备份自管理的分片集群。
请确保您的备份可用,方法是将它们恢复到测试 MongoDB 部署中。
为了帮助降低分片集群备份中不一致性的可能性,您必须在整个备份期间停止均衡器、停止所有写入操作以及停止任何模式转换。
输出格式
mongorestore
和 mongodump
可以将数据输出到存档文件,这是多个 BSON 文件的单一文件替代品。存档文件是特殊用途的格式,支持非连续文件写入。它们使 MongoDB 可以同时进行备份和恢复。使用存档文件可以在备份和恢复操作执行时优化磁盘 I/O。
您还可以将存档文件输出到标准输出(stdout
)。写入标准输出允许通过网络迁移数据、减少磁盘 I/O 脚印以及在 MongoDB 工具和您的存储引擎中提高并发性。
有关存档文件的信息,请参阅 --archive
选项。
程序
使用 mongodump
备份数据库
注意
使用 MongoDB Atlas 备份分片集群
要使用 mongodump
和 mongorestore
作为分片集群的备份策略,请参阅 使用数据库转储备份自管理的分片集群。
分片集群还可以使用以下协调的备份和恢复过程之一,这些过程保持跨分片的事务原子性保证
排除 local
数据库
mongodump
在其输出中排除了 local
数据库的内容。
所需访问权限
要对启用了访问控制的MongoDB部署运行mongodump
,您必须拥有为每个要备份的数据库授予访问控制的权限。内置的find
操作的backup
角色提供了所需的权限以备份任何数据库。
backup
角色还提供了备份在system.profile
集合的额外权限,该集合是在使用数据库分析时运行的。
基本的 mongodump
操作
该实用程序可以创建整个服务器、数据库或集合的备份,或者可以使用查询仅备份集合的一部分。
当您在没有任何参数的情况下运行mongodump
时,该命令将连接到本地系统(例如 localhost
)上的MongoDB实例(端口 27017
),并在当前目录中创建名为 dump/
的数据库备份。
要从运行在同一台机器上默认端口 27017
的mongod
实例备份数据,请使用以下命令
mongodump
要指定MongoDB实例的主机和端口,您可以
在
--uri
字符串中指定主机名和端口,使用SRV或标准连接字符串mongodump --uri="mongodb+srv://username:password@cluster0.example.mongodb.net" <additional_options> 在
--host
字符串中指定主机名和端口mongodump --host="mongodb0.example.com:27017" <additional_options> 在
--host
和--port
中指定主机名和端口mongodump --host="mongodb0.example.com" --port=27017 <additional_options>
mongodump
将写入 BSON 文件,这些文件包含通过监听 mongodb.example.net
主机端口 27017
的 mongod
访问的数据副本。有关更多信息,请参阅 从非本地 mongod
实例创建备份。
要指定不同的输出目录,可以使用 --out 或 -o
选项
mongodump --out=/opt/backup/mongodump-1
要限制数据库转储中包含的数据量,可以在 mongodump
中指定 --db
和 --collection
作为选项。例如
mongodump --collection=myCollection --db=test
此操作将在当前工作目录的 dump/
子目录中创建名为 myCollection
的集合的转储,来自数据库 test
。
mongodump
将覆盖备份数据文件夹中存在的输出文件。在多次运行 mongodump
命令之前,请确保您不再需要输出文件夹中的文件(默认为 dump/
文件夹)或重命名文件夹或文件。
使用 Oplog 创建备份
使用 --oplog
选项与 mongodump
一起收集 oplog 条目,并允许您对实时数据库执行备份。如果您稍后从备份中恢复数据库,则数据库将与备份过程完成时的状态相同。
使用--oplog
,mongodump
命令会复制源数据库中的所有数据以及从备份开始到结束的所有操作日志(oplog)条目。此操作与mongorestore --oplogReplay
结合使用,可让您恢复一个反映mongodump
完成创建备份文件那一刻特定时间的备份。
从非本地mongod
实例创建备份
--host
和--port
选项允许您连接到并从远程主机备份mongodump
。以下是一个示例
mongodump \ --host=mongodb1.example.net \ --port=3017 \ --username=user \ --password="pass" \ --out=/opt/backup/mongodump-1
在任何mongodump
命令中,您都可以像上面一样指定用户名和密码凭据以指定数据库身份验证。
使用 mongorestore
恢复数据库
注意
使用 MongoDB Atlas 备份分片集群
要使用 mongodump
和 mongorestore
作为分片集群的备份策略,请参阅 使用数据库转储备份自管理的分片集群。
分片集群还可以使用以下协调的备份和恢复过程之一,这些过程保持跨分片的事务原子性保证
访问控制
要将数据恢复到已启用访问控制的MongoDB部署,restore
角色提供从备份恢复数据的必要权限,前提是数据不包含system.profile
集合数据,并且您在不使用--oplogReplay
选项的情况下运行mongorestore
。
如果备份数据包含system.profile
集合数据或您使用--oplogReplay
运行,则需要额外的权限
system.profile | 如果备份数据包含 内置角色 |
--oplogReplay | 要使用 仅授予必须使用 |
基本mongorestore
操作
mongorestore
实用程序可以恢复由mongodump
创建的二进制备份。默认情况下,mongorestore
会在dump/
目录中查找数据库备份。
mongorestore
实用程序通过直接连接到正在运行的mongod
来恢复数据。
mongorestore
可以恢复整个数据库备份或备份的子集。
注意
所有 MongoDB 集合都默认具有UUIDs。当 MongoDB 恢复集合时,恢复的集合保留其原始 UUIDs。当恢复一个没有 UUID 的集合时,MongoDB 为恢复的集合生成一个 UUID。
有关集合 UUID 的更多信息,请参阅 集合。
要使用 mongorestore
连接到活动 mongod
,请使用以下原型形式的命令
mongorestore --uri <connection string> <path to the backup>
考虑以下示例
mongorestore /opt/backup/mongodump-1
在这里,mongorestore
将 /opt/backup/mongodump-1
目录中的数据库备份导入到运行在本地主机接口默认端口 27017
上的 mongod
实例。
使用 Oplog 文件备份和恢复数据
要捕获 mongodump
运行期间可能发生的写入,请使用 mongodump --oplog
。 mongodump
为运行期间发生的每个写入创建一个包含 oplog 条目的 oplog.bson
文件。您可以使用 mongorestore --oplogReplay
应用 oplog 操作。
有关示例,请参阅 mongodump 示例 和 mongorestore 示例。
将恢复 oplog.bson
文件中的所有数据。
mongorestore --oplogReplay
不允许您将数据恢复到任意时间点。使用 mongorestore --oplogReplay
确保恢复的数据与 mongodump --oplog
运行期间发生的任何写入保持最新。
注意
--oplog
旨在与副本集一起使用。对于分片集群,包括作为分片环境一部分的副本集,请参阅 使用数据库转储备份自管理分片集群。
您还可以考虑使用 mongorestore --objcheck
选项来检查在将对象插入数据库时的完整性,或者您可以考虑使用 mongorestore --drop
选项在从备份中恢复之前删除数据库中的每个集合。
将备份恢复到非本地的 mongod
实例
默认情况下,mongorestore
连接到运行在本地接口和默认端口(27017
)上的 MongoDB 实例。如果您想恢复到不同的主机或端口,请使用 --host
和 --port
选项。
mongorestore --host=mongodb1.example.net --port=3017
如果恢复到强制执行访问控制的实例,请包括 --username
和 --authenticationDatabase
。省略 --password
选项,让 mongorestore
提示输入密码
mongorestore \ --host=mongodb1.example.net \ --port=3017 \ --username=user \ --authenticationDatabase=admin \ /opt/backup/mongodump-1