本教程介绍如何使用 mongodump 创建备份,以及使用 mongorestore 恢复数据。将自托管备份恢复到 MongoDB Atlas 托管部署的方法,见使用 mongorestore 初始化数据的文档。
注意事项
部署类型
mongodump 与 mongorestore 处理 BSON 数据转储,适合小型部署。需要可靠且不干扰服务的备份时,可使用文件系统快照,或 MongoDB Atlas Cloud Backups 的块级磁盘快照。
分片集群若采用这两个工具作为备份策略,应阅读“使用数据库转储备份自管理分片集群”。也可以使用 MongoDB Atlas、Cloud Manager 或 Ops Manager 的协调备份恢复流程,这些流程能够维持跨分片事务的原子性保证。
性能影响
工具与正在运行的 mongod 交互,可能影响性能。它们会产生流量,并迫使数据库通过内存读取全部数据。读取不常访问的数据时,会逐出经常使用的数据,降低日常工作负载性能。
使用 MongoDB 工具备份时,请遵循:
- 标记文件,注明备份内容与时间。
- 如果性能影响不可接受,改用文件系统快照或 Atlas Cloud Backups。
- 为取得一致的副本集备份,必须使用
--oplog捕获备份期间的写入,或者在备份期间停止副本集所有写入。 - 对属于分片集群的副本集,按自管理分片集群数据库转储备份文档操作。
- 将备份恢复到测试部署,以验证备份。
- 为减少分片集群备份的不一致,备份期间停止平衡器、全部写操作和模式变更。
更多方法见自管理部署备份指南。相关工具参考包括 mongoexport、mongoimport、mongodump 和 mongorestore。
输出格式
工具支持 archive 归档文件,以单个文件代替多个 BSON 文件。这种专用格式支持非连续写入,允许并行备份与恢复,并优化磁盘 I/O。
还可以将归档写入标准输出 stdout,以便通过网络迁移数据、减少磁盘 I/O,并提高工具和存储引擎的并发能力。详情见 --archive 选项。
备份的时效性
备份是数据库某一时刻的快照。恢复后不包含备份创建之后的变化,因此可能丢失后续数据。
使用 mongodump 备份数据库
mongodump 连接正在运行的 mongod,可以备份整个服务器、某个数据库、某个集合,或通过查询备份集合的一部分。输出不包含 local 数据库内容。
不带参数时,工具连接本机 27017 端口,并在当前目录创建 dump/:
mongodump
指定主机与端口有三种方式。
使用 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>
使用 --out 或 -o 指定输出目录:
mongodump --out=/opt/backup/mongodump-1
使用 --db 与 --collection 限定数据库或集合:
mongodump --collection=myCollection --db=test
此命令将 test 数据库的 myCollection 导出到当前目录下的 dump/。
mongodump 会覆盖输出目录中的已有文件,默认目录是 dump/。重复运行前,应备份或重命名该目录。
所需权限
部署启用了访问控制时,需要对每个待备份数据库拥有 find 权限。内置 backup 角色提供备份全部数据库所需的权限,也包含备份数据库分析器使用的 system.profile 集合的额外权限。
指定主机与端口
连接远程实例:
mongodump \
--host=mongodb1.example.net \
--port=3017 \
--username=user \
--password="pass" \
--out=/opt/backup/mongodump-1
可在任意 mongodump 命令中指定用户名和密码进行身份验证。
使用 oplog 创建备份
--oplog 会收集备份期间的 oplog 条目,以便恢复到备份完成时刻的状态。它复制全部源数据,以及备份开始到结束之间的 oplog。结合 mongorestore --oplogReplay,即可还原 mongodump 完成瞬间的准确状态。
使用 mongorestore 恢复数据库
mongorestore 直接连接正在运行的 mongod,恢复 mongodump 创建的二进制备份。默认从 dump/ 查找,可以恢复全部备份或其中一部分。
注意:MongoDB 集合默认有 UUID。恢复时保留原 UUID;原集合没有 UUID 时,会为恢复后的集合生成一个。
连接运行中的 mongod:
mongorestore --uri <connection string> <path to the backup>
例如,从目录恢复:
mongorestore /opt/backup/mongodump-1
该命令恢复到 localhost:27017。
访问控制
如果备份不包含 system.profile,且不使用 --oplogReplay,内置 restore 角色提供恢复所需权限。
以下情况需要额外权限:
- system.profile:备份包含该集合,而目标数据库尚无此集合时,工具会尝试创建集合,尽管不会实际恢复其中的文档。用户需要对该数据库的
system.profile拥有createCollection与convertToCapped权限。内置dbAdmin和dbAdminAnyDatabase都提供这些权限。 - –oplogReplay:需要创建对
anyResource拥有anyAction的自定义角色。仅授予确实必须使用该选项恢复的用户。
指定主机与端口
默认连接 localhost:27017。连接其他主机或端口:
mongorestore --host=mongodb1.example.net --port=3017
需要身份验证时,加入 --username 与 --authenticationDatabase。省略 --password 可以让工具交互式询问密码:
mongorestore \
--host=mongodb1.example.net \
--port=3017 \
--username=user \
--authenticationDatabase=admin \
/opt/backup/mongodump-1
使用 oplog 文件恢复
备份时使用 --oplog,会生成 oplog.bson,记录运行期间每次写入。恢复时通过 --oplogReplay 应用这些操作。
mongorestore --oplogReplay 会恢复 oplog.bson 的全部数据,但不支持任意时间点恢复。它用于确保恢复结果包含 mongodump --oplog 运行期间发生的写入。
注意:--oplog 面向副本集。分片集群及其内部副本集,应按分片集群数据库转储备份指南操作。
使用 --objcheck 可以在插入时验证文档完整性;使用 --drop 则会在恢复前删除每个目标集合。
原文:Back Up and Restore with MongoDB Tools。作者/维护方:MongoDB 文档维护者。本文为中文翻译,代码及命令保留原文。











暂无评论内容