【问题标题】:Dump and restore mongo database without mongodump command不使用 mongodump 命令转储和恢复 mongo 数据库
【发布时间】:2015-02-25 08:34:50
【问题描述】:

我需要一种方法来为特定的 mongo 数据库生成快照,并能够在另一台服务器上重新创建该数据库。我熟悉 mongodumpmongorestore 命令,但是我需要一个用于整个数据库的单个人类可读文件(或者更好地将所有内容打印到标准输出),而 mongodump 不需要还要做,这是已知的和预期的,here are the details why。我有两个相关的问题。

首先,mongodump 除了集合名称和索引(在转储特定数据库时)之外,是否产生任何其他关键数据?如果它产生了它是什么?如果我没记错的话,mongo 可能不喜欢不同版本的转储,这也可能是个问题,是这样吗?

其次,如果我手动提取集合名称和索引信息,将其存储为我自己格式的 json,然后将其还原到另一台服务器上,这足以创建相同的数据库还是会丢失一些东西?

【问题讨论】:

  • 检查 mongoexport 命令。它将数据导出为 CSV、TSV 或 JSON 文件。
  • 您检查 mongoexport 命令并阅读它的作用以及它与 mongodump 的区别......

标签: mongodb mongodump mongorestore


【解决方案1】:

首先,除了集合名称和索引(转储特定数据库时)之外,mongodump 是否会产生任何其他关键数据?如果它产生了什么是什么?

mongodump 生成数据的二进制备份,包括用于字段的特定 BSON types。导出的其他元数据包括集合选项(如果您更改了默认选项)和索引定义。您可以在mongodump 创建的*.metadata.json 文件中看到这些附加信息。

如果我没记错的话,mongo 可能不喜欢不同版本的转储,这也可能是个问题,是这样吗?

一般来说,您应该能够使用较新的mongorestore 版本重播较旧的转储。一些旧版本的mongodump 可能不会导出您期望的所有集合元数据,因此一般建议是mongodump 至少使用您正在运行的mongod 服务器版本(如果不是较新版本)。一个这样的示例是 2.2 之前的 mongodump,它不会创建 metadata.json 信息,因此您必须手动确保索引和收集选项。

其次,如果我手动提取集合名称和索引信息,将其存储为我自己格式的 json,然后将其还原到另一台服务器上,这足以创建相同的数据库还是会丢失一些东西?

假设您重新创建所有集合和索引选项(并在创建新集合时正确应用这些选项),您的数据库在远程服务器上将是相似的,但可能不完全相同。

主要区别在于字段的类型完整性(尽管这可能与您的用例无关)。 BSON 支持比 JavaScript 更丰富的数据类型。例如,JavaScript 有一个 Number 类型,而 BSON 支持 int32、int64 和 double。

如果您的备份/恢复过程考虑到这一点,使用 MongoDB Extended JSON 之类的东西来表示其他类型,您可能可以使两个数据库更加一致。

【讨论】:

  • 太完美了。我不知道元数据在这里的作用,我会更深入地研究一下。非常感谢!
  • 更快速的事情是,我是否正确理解类型与特定文档相关,而不是一般的集合,以及存储在元数据中的内容?
  • 不,metadata.json 只是用相同的选项和索引重新创建集合。收集选项是您将传递给db.createCollection()collMod 的内容。文档中的字段类型存储在每个文档中。
  • @IanBytchek 另外,我很好奇为什么您需要转储的“人类可读”格式。我会使用mongodump 进行备份,而不是重复开发自己的解决方案。如果需要,您可以使用 MongoDB 命令行工具中包含的 bsondump 工具将 BSON 转换为人类可读的格式。
  • 这不是要求,而是偏好。我正在整理一个为 sql 和 mongo 进行数据库迁移的项目。比较两者,使用 sql 数据库,您可以将所有内容转储到一个文件中,然后您可以将其与其他转储进行比较。用 mongo 没那么容易。我已经将基本的 mongo 模式(集合和索引)存储在单独的可恢复 json 文件中一段时间​​了,它工作得很好,而且很容易比较它们。现在,我正在尝试进行系统化,并弄清楚这种方法是否可以涵盖其他更复杂的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多