MongoDB Academy · 课时

使用 mongodump 和 mongorestore 完成完整备份

您将创建数据库的完整 BSON 转储,并使用 mongorestore 将其恢复到其他集群。

第 3 / 4 课13 个步骤

使用 mongodump 和 mongorestore 完成完整备份 是 CoddyKit 上的免费 MongoDB Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 MongoDB Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 MongoDB Academy 课程共包含 4 节课。

为什么使用 mongodump 进行备份

mongodump 会创建数据库或集合的二进制 BSON 快照。与生成可读 JSON 的 mongoexport 不同,mongodump 可以准确保留所有 BSON 类型信息——包括 ObjectId、日期、十进制数和二进制数据——不会损失任何保真度。因此,在 MongoDB 集群之间进行完整数据库备份和迁移时,应使用该工具;而选择性数据共享则更适合使用 mongoexport。

mongodump 的基本用法

不带参数运行 mongodump 时,会将本地 MongoDB 实例中的所有数据库导出到 dump/ 目录。指定 --uri、--db,并可选地指定 --collection,以缩小范围。输出目录中每个数据库都有一个子目录,每个集合分别包含 .bson 和 .metadata.json 文件。

# Dump the entire 'myapp' database
mongodump \
  --uri 'mongodb://localhost:27017' \
  --db myapp \
  --out /backups/myapp-2024-01-15

# Output structure:
# /backups/myapp-2024-01-15/
#   myapp/
#     users.bson
#     users.metadata.json
#     products.bson
#     products.metadata.json

导出单个集合

使用 --collection,只导出数据库中的一个集合。此操作会生成一个 .bson 文件,以及相应的 .metadata.json 文件(用于存储索引定义)。在不备份整个数据库的情况下提取单个集合进行迁移时,定向集合导出非常有用。

# Dump only the 'orders' collection
mongodump \
  --uri 'mongodb://localhost:27017' \
  --db myapp \
  --collection orders \
  --out /backups/orders-backup

# Result: /backups/orders-backup/myapp/orders.bson
#         /backups/orders-backup/myapp/orders.metadata.json

压缩导出文件

大型 BSON 导出文件可能会占用大量磁盘空间。使用 --gzip,可以在写入输出文件时对其进行压缩。每个 .bson 文件都会变为 .bson.gz 文件,典型文档集合通常可以实现 5 到 10 倍的压缩。压缩过程在 mongodump 中执行,mongorestore 必须使用相应的 --gzip 选项才能解压。

# Create a compressed backup
mongodump \
  --uri 'mongodb://localhost:27017' \
  --db myapp \
  --gzip \
  --out /backups/myapp-compressed-2024-01-15

# Files are now .bson.gz:
# /backups/myapp-compressed-2024-01-15/myapp/users.bson.gz
# /backups/myapp-compressed-2024-01-15/myapp/orders.bson.gz

归档为单个文件

使用 --archive,可以将整个导出结果写入单个归档文件,而不是目录树。您还可以将其通过管道传递给 gzip 或 aws s3 cp,一步完成压缩备份和上传。这是用于在持续集成或定时任务中自动执行备份时,最紧凑且最便于移植的导出格式。

# Archive + compress to a single file
mongodump \
  --uri 'mongodb://localhost:27017' \
  --db myapp \
  --archive=/backups/myapp-2024-01-15.archive.gz \
  --gzip

# Or pipe to gzip
mongodump \
  --uri 'mongodb://localhost:27017' \
  --db myapp \
  --archive | gzip > /backups/myapp-2024-01-15.gz

mongorestore 的基本用法

mongorestore 会读取由 mongodump 创建的目录或归档,并将文档插入目标 MongoDB 集群。数据加载完成后,它会根据 .metadata.json 文件中的索引定义重新创建集合及其索引。使用 --uri 指定目标集群,使用 --dir 或 --archive 指定源目录或归档文件。

# Restore the full myapp database from a directory backup
mongorestore \
  --uri 'mongodb://restore-target:27017' \
  --dir /backups/myapp-2024-01-15

# Restore a gzip-compressed directory backup
mongorestore \
  --uri 'mongodb://restore-target:27017' \
  --gzip \
  --dir /backups/myapp-compressed-2024-01-15

还原到其他数据库名称

默认情况下,mongorestore 会还原到导出文件中使用的相同数据库名称。使用 --nsFrom 和 --nsTo(命名空间的源名称和目标名称),可以还原到不同的数据库或集合名称。当您需要将生产数据克隆到名称不同的预发布数据库时,这一功能必不可少。

# Restore 'myapp' from dump into 'myapp_staging'
mongorestore \
  --uri 'mongodb://localhost:27017' \
  --nsFrom 'myapp.*' \
  --nsTo 'myapp_staging.*' \
  --dir /backups/myapp-2024-01-15

还原时的 --drop 选项

与 mongoimport 类似,mongorestore 也提供 --drop 选项,会在还原每个集合前先删除该集合。不使用 --drop 时,mongorestore 会将还原的文档与已有数据合并,这对于部分还原很有用。使用 --drop 时,可以干净地替换集合;对于完整数据库还原,这样可以避免过期数据与备份数据混杂,因此更加安全。

# Drop and fully replace all collections during restore
mongorestore \
  --uri 'mongodb://localhost:27017' \
  --db myapp \
  --drop \
  --dir /backups/myapp-2024-01-15/myapp

使用 --numParallelCollections 并行还原

对于包含许多集合的数据库,mongorestore 可以并行还原多个集合。使用 --numParallelCollections(默认值:4)可以在 I/O 容量较高的服务器上提高并行度。并行还原数量越多,总还原时间越短,但客户端和服务器的内存及 CPU 使用量也会增加。

# Restore 8 collections in parallel
mongorestore \
  --uri 'mongodb://restore-target:27017' \
  --dir /backups/myapp-2024-01-15 \
  --numParallelCollections 8

使用定时任务自动执行备份

您可以通过定时任务运行 shell 脚本,自动执行每日备份。该脚本会创建带时间戳的备份目录、运行 mongodump、压缩结果,并可选择将其上传到 S3 或其他远程存储。请务必检查 mongodump 的退出代码,以便在覆盖上一次备份前检测备份是否失败。

#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backups/myapp-$DATE"

mongodump \
  --uri "$MONGO_URI" \
  --db myapp \
  --gzip \
  --out "$BACKUP_DIR"

if [ $? -eq 0 ]; then
  echo "Backup successful: $BACKUP_DIR"
else
  echo "Backup FAILED!"
  exit 1
fi

Atlas 中的时间点备份

MongoDB Atlas 提供自动化时间点(PIT)备份,每 6 小时创建一次快照,并允许您还原到保留窗口内的任意一秒(M10 及更高层级最多支持 35 天)。Atlas 备份不使用 mongodump,而是在存储引擎层面利用文件系统快照,因此不会影响系统运行。对于自行托管的 MongoDB,mongodump 是主要的备份机制,但它属于逻辑备份,无法捕获正在进行中的事务。

快速检查

测试您对本课 MongoDB 和 NoSQL 数据库相关概念的理解。

课程回顾

本课您学到了:mongodump 会创建保留所有类型信息的二进制 BSON 备份,mongorestore 会读取这些导出文件,并使用原有索引重新创建集合,以及--drop、--nsFrom/--nsTo 和 --gzip 是生产环境备份流程中的重要选项。接下来我们将编写 Node.js 初始数据脚本,在开发过程中以编程方式将数据加载到 MongoDB 中。

免费开始

用 AI 导师学习 JavaScript — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「使用 mongodump 和 mongorestore 完成完整备份」课时是免费的吗?

是的 — 「使用 mongodump 和 mongorestore 完成完整备份」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 MongoDB Academy 课程的其余内容,请升级到 CoddyKit PRO。 MongoDB Academy 课程共包含 4 节课。

「使用 mongodump 和 mongorestore 完成完整备份」这节课中我会学到什么?

您将创建数据库的完整 BSON 转储,并使用 mongorestore 将其恢复到其他集群。 你通过在浏览器中直接运行的动手代码来练习 MongoDB Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 MongoDB Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 MongoDB Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 mongodump 和 mongorestore 完成完整备份」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 MongoDB Academy 课中编写并运行代码吗?

能。每节 MongoDB Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. mongoimport:加载 JSON 和 CSV 文件
  2. mongoexport:将集合导出到文件
  3. 使用 mongodump 和 mongorestore 完成完整备份
  4. 使用 Node.js 脚本填充数据
← 返回 MongoDB Academy