用mongoexport还是mongodump备份?


9

对于生产备份,MongoDB建议使用mongodump而不是mongoexport来确保数据的准确性。但是,我需要在备份之前从MongoDB数据库中“清理”数据。除了mongoexport之外,我不知道任何服务器端数据清理选项。两个问题:

  1. mongoexport是否访问RAM中的MongoDB缓存?它会像mongodump一样改变RAM中的工作集吗?
  2. mongodump命令具有此--query选项。“提供JSON文档作为查询,可以选择限制mongodump输出中包含的文档。” 是否需要查询以排除文档中的某些字段?

1
听起来您正在寻找导出而不是备份。如果仅导出字段的子集,则可能无法还原该字段,并且拥有完全可用的数据库。还可以考虑其他一些选择:使用敏感数据(通过应用程序代码)对任何字段进行加密,以便您可以执行常规mongodump或文件系统快照备份,或者在mongoexport不需要的情况下编写自定义导出。mongod如果要导出的数据大于可用的RAM,则从中读取数据的任何工具或程序都可能会更改您的工作集。文件系统快照的破坏性较小
Stennie

感谢您的澄清。我没有想到对字段加密,这是个好建议。
Howard Lee

Answers:


6

作为第一个问题的答案,两个工具(默认情况下)都将遍历_id索引以获取数据,然后将其写出到磁盘。因此,是的,这两种工具都会类似地影响您的工作集,这就是为什么我通常建议针对辅助服务器(如果可能的话最好是隐藏的辅助服务器)运行它们的原因。如果要处理大量数据,我将在此处的注释中回应Stennie,并建议其他备份方法。

对于第二个问题,我假设您正在寻找mongodump--fields选项相同的选项,mongoexport以便仅转储特定字段。该查询选项可以用来筛选结果,但它无法与投影使用(选择返回的字段) -这是正在跟踪的功能要求TOOLS-28,但还没有计划。正如Stennie所提到的,这里的另一种选择是编写一个满足您需求的自定义导出器(同样,我仍然建议针对辅助服务器运行它,以保护您的工作集)。


6
  1. (抱歉,邓诺)

  2. --query将选择或排除整个文档,而不是字段。

不过,这将是一个好主意:

--query '{datetime:{$gt:ISODate("2014-01-01T00:00:00.000Z")}},{_id:0,name:1,address:1,interests:1}'* )
  1. Mongodump使用bson文件结构并保留数据类型Mongoexport丢失值的数据类型。例如NumberLong(“ 1431677405876”)将被转换为1431677405876。这就是为什么建议mongodump如果您需要导入回MongoDB。

感谢您对--query的说明,以及有关mongoexport损失数据类型的示例。
Howard Lee

0

Mongoexport实际上确实保留类型,但是它使数据不一致。如果您要导出带有Ints和Longs的字段,它将分别将其导出为Numbers和JSON对象,这会使您的工作更加困难。

“严格模式。BSON类型的严格模式表示形式符合JSON RFC。任何JSON解析器都可以将这些严格模式表示形式解析为键/值对;但是,只有MongoDB内部JSON解析器才能识别格式所传达的类型信息。”

https://docs.mongodb.com/manual/reference/mongodb-extended-json/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.