使用 MongoDB 工具备份与恢复数据

本教程介绍如何使用 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 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容