使用 MongoDB 工具备份和恢复自管理部署
本教程描述了使用 MongoDB 提供的命令行工具 mongorestore
和 mongodump
创建备份以及恢复数据的过程。
如要将自托管部署的备份恢复到托管的 MongoDB Atlas 部署 ,请参阅使用 mongorestore 填充数据。
对于完全托管的备份方法,请使用 MongoDB Atlas 中的云备份,它使用集群云服务提供商的原生快照功能提供本地化备份存储。
Considerations
部署
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 中进行并发备份以及恢复到 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
实用程序通过连接正在运行的 mongod
来备份数据。
该工具可以为整个服务器、数据库或集合创建备份,也可以结合查询来仅备份一个集合的某一部分。
在不带任何参数的情况下运行 mongodump
时,该命令会连接到本地系统(即localhost
)上的 MongoDB 实例(通过端口 27017
),并在当前目录中创建名为 dump/
的数据库备份。
要从在同一台计算机和默认端口 27017
上运行的 mongod
实例备份数据,请使用以下命令:
mongodump
要指定 MongoDB 实例的主机和端口,您可以:
使用 SRV 或标准连接字符串,在
--uri
字符串中指定主机名和端口: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
or -o
选项:
mongodump --out=/opt/backup/mongodump-1
要限制数据库转储中包含的数据量,可将 --db
和 --collection
指定为 mongodump
的选项。例如:
mongodump --collection=myCollection --db=test
此操作会在当前工作目录的 dump/
子目录中的数据库 test
内创建名为 myCollection
的集合转储。
如果输出文件存在于备份数据文件夹中,则 mongodump
会覆盖这些文件。在多次运行 mongodump
命令之前,请确保不再需要输出文件夹(默认为 dump/
文件夹)中的文件,或是重命名此文件夹或这些文件。
使用 Oplogs 创建备份
带有 mongodump
的 --oplog
选项可收集 oplog 条目并允许您在实时数据库上执行备份。如果您稍后从备份恢复数据库,数据库将与备份完成时的数据库相同。
借助 --oplog
,mongodump
拷贝源数据库中的所有数据以及从备份过程开始到结束的所有 oplog 条目。将此操作与 mongorestore
--oplogReplay
结合可恢复备份,该备份可反映与 mongodump
完成创建转储文件时对应的特定时刻。
从非本地mongod
实例创建备份
mongodump
的 --host
和 --port
选项,允许您连接到远程主机并从远程主机进行备份。考虑以下示例:
mongodump \ --host=mongodb1.example.net \ --port=3017 \ --username=user \ --password="pass" \ --out=/opt/backup/mongodump-1
在任何 mongodump
命令中,您都可以像上面一样指定用户名和密码凭证,以进行数据库身份验证。
恢复数据库 mongorestore
注意
使用 MongoDB Atlas 备份分片集群
要使用mongodump
和mongorestore
作为分片集群的备份策略,请参阅使用数据库转储备份自管理分片集群。
分片集群还可以使用以下协调备份和恢复流程之一,以确保跨分片事务的原子性:
访问控制
要将数据恢复到已启用访问控制的 MongoDB 部署,如果数据不包含 system.profile
集合数据且您在不使用 --oplogReplay
选项的情况下运行 mongorestore
,则 restore
角色提供从备份中恢复数据的必要权限。
如果备份数据包含 system.profile
集合数据,或者您使用 --oplogReplay
运行,将需要额外的权限:
system.profile | 如果备份数据包含 内置角色 |
--oplogReplay | 要使用 仅授予必须使用 |
基本mongorestore
操作
mongorestore
实用程序会恢复 mongodump
创建的二进制备份。默认情况下,mongorestore
会在 dump/
目录中查找数据库备份。
mongorestore
实用程序会通过直接连接到正在运行的 mongod
来恢复数据。
mongorestore
可以恢复整个数据库备份或部分的备份。
注意
所有 MongoDB 集合默认都有 UUID。MongoDB 恢复集合时,恢复的集合保留其原始 UUID。恢复不存在 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.bson
文件,其中包含 oplog 条目。您可以使用 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