HOWTO · MongoDB

创建数据库的 MongoDB 转储

使用 mongodump 导出 MongoDB 数据库或集合,可选择目录或归档文件作为输出,并使用 mongorestore 恢复转储。

本页内容

使用 mongodump 在系统命令行中导出一个或所有 MongoDB 数据库,选择目录或归档文件作为输出,并使用 mongorestore 恢复结果。以下命令连接本地 MongoDB 服务器;如果服务器需要其他连接或身份验证选项,请相应添加。

mongodump 会创建什么以及如何运行

mongodump 从正在运行的 MongoDB 部署中读取数据,并写入二进制导出文件。它是 MongoDB Database Tools 中的命令行实用程序,应在终端中运行,而不是在 MongoDB shell 中运行。典型命令格式为 mongodump [options] [connection-string]。

转储包含导出集合的 BSON 数据文件和元数据文件。mongorestore 用于读取这些文件;它们不是供人直接阅读的 JSON 导出文件。如果任务明确要求 JSON 或 CSV 数据,请使用 mongoexport。

你可以使用 URI 连接,也可以使用单独的选项标志。URI 可以包含主机、端口和数据库路径;不要将真实密码写入会保留在 shell 历史记录中的命令,也不要分享包含真实密码的命令。使用单独的选项标志时,可指定 --username、--password 和 --authenticationDatabase。如果账户定义在 admin 中,即使要转储的数据位于其他数据库,也应将身份验证数据库设为 admin。省略 --password 后,工具可以提示你输入密码。请确保账户有权读取目标数据。

运行以下示例:

本节中的代码以及显示的标签或输出仍为英文。

database = "inventory"
destination = "backup"
print(f"mongodump --db={database} --out={destination}")
mongodump --db=inventory --out=backup

这段 Python 代码会为本地服务器打印一条命令;它不会连接 MongoDB,也不会创建转储。请在已安装 MongoDB Database Tools 且能够访问该服务器的终端中运行打印出的命令。

转储单个数据库

要将一个数据库转储到目录中,请用 --db 指定数据库名称,并用 --out 选择父目录。例如,mongodump --db=inventory --out=backup 会将数据库写入 backup 目录下。通常无需指定 --out:工具默认在当前工作目录中使用名为 dump 的目录。

数据库名为 inventory 时,常见目录结构是 backup/inventory/,其中每个集合都有一个 .bson 文件及对应的 .metadata.json 文件。例如,名为 products 的集合对应 backup/inventory/products.bson 和 backup/inventory/products.metadata.json。BSON 文件包含集合数据;元数据文件可能包含集合选项和索引定义。

若要只转储一个集合,请在 --db 旁添加 --collection,例如 mongodump --db=inventory --collection=products --out=backup。结果仍会放在数据库对应的目录下。若要在另一次运行中包含其他集合,请选择不同的目标位置,或先检查目标目录;不要假设重复运行会安全地追加内容或保留已有文件。

使用 URI 连接时,可将 URI 与相同的数据范围和输出选项结合使用,例如 mongodump --uri="mongodb://db.example.test:27017/" --db=inventory --out=backup。请将主机替换为你的服务器,并按照环境批准的凭据处理方式添加身份验证。--db 指定转储的数据范围;--authenticationDatabase 指定 MongoDB 检查用户凭据的数据库。

转储所有数据库

若要包含已连接账户可访问且可转储的所有数据库,请省略 --db 和任何集合筛选条件。即使转储所有数据库,mongodump 也会排除 local 数据库。对于本地服务器,mongodump --archive=all-databases.archive 会将转储写入一个归档文件。使用身份验证时,请添加相应的用户名和身份验证数据库,并安全地提供密码,或让工具提示你输入。

归档文件便于作为单个文件传输。要恢复它,请将相同的归档路径与 --archive 一并传给 mongorestore。--archive 和 --out 用于选择不同的输出形式,不能同时使用:目录树形式使用 --out,单个归档文件则使用 --archive。像 --db=inventory 这样的数据库筛选条件会改变转储范围;目标是转储所有数据库时,请省略它。

使用 mongorestore 恢复转储

要将目录转储恢复到 MongoDB 部署中,请将转储目录传给 mongorestore,例如 mongorestore --uri="mongodb://localhost:27017/" backup/。若使用默认目录,请运行 mongorestore dump/。目录结构会提供源数据库和集合的名称。要连接其他服务器,请添加 URI 或 --host、--port、--username 和 --authenticationDatabase 等连接选项。

归档文件应使用归档选项指定,而不是作为目录路径传入:mongorestore --archive=all-databases.archive。根据需要添加目标连接选项。对重要数据执行命令前,请先恢复到测试环境或预定的目标位置,并检查所选命名空间。

若要从目录转储中只恢复特定集合,请使用 --nsInclude 和命名空间模式。例如,mongorestore --nsInclude="inventory.products" backup/ 会选择 inventory 数据库中的 products 集合。inventory.* 这样的模式会选择该数据库中的所有集合。如果源名称和目标名称不同,请将 --nsFrom 和 --nsTo 等命名空间映射选项与 --nsInclude 配合使用。

mongorestore 会向目标集合插入文档。若目标中已有相同 _id 的文档,可能会发生重复键错误;默认操作不会先清空目标集合。--drop 选项会在恢复前删除每个目标集合,因此只有在确实要替换这些集合时才使用它。恢复可能在报告错误的同时只完成一部分;请检查终端消息并验证恢复后的集合。

选择输出形式并验证备份

如果你希望集合文件位于便于浏览的目录树中,请选择 --out;如果一个便于传输的文件更合适,请选择 --archive。使用 --db 转储单个数据库,添加 --collection 可只转储一个集合;省略这两个筛选条件则会转储所有数据库。使用 mongorestore 时,应选择与目录或归档文件相匹配的形式;只恢复部分转储内容时,请应用命名空间筛选条件。

在依赖转储数据之前,请确认目标位置存在,并包含预期的数据库目录或归档文件。对于目录转储,请检查其中是否有目标集合的 BSON 文件和元数据文件。对于归档文件,请确认文件已创建且大小合理、非零。随后将其恢复到安全的目标位置,并检查预期的数据库和集合是否可用。仅仅看到文件存在,并不能证明所有目标集合都已包含在内,也不能保证恢复一定成功。