【问题标题】:mongodump file corruption on virtual machine虚拟机上的mongodump文件损坏
【发布时间】:2020-01-23 03:01:03
【问题描述】:

今天我正在做 mongodump 来备份一个文件大小约为 2GB 的数据库,但转储文件中只有大约 600 mb。 mongodump 操作没有错误信息,后来我发现有些文件丢失了。如果不是因为文件大小的巨大差异,我不会知道转储不成功。

是否有标准方法来检查转储文件是否正确?

p.s: 看来我可以使用db.stats() 来检查原始的db 信息,然后mongorestore 转储的db 并做db.stats() 来比较总文件大小。并且两个文件大小相同(对吗)?

p.s:另外,如果我的 VM 有 500 mb 的内存,它能否成功转储 2GB 的文件?

【问题讨论】:

  • 如何判断它已损坏?转储通常比磁盘上的数据库小,因为它们不包含索引数据,例如,可以简单地重新生成。
  • 我在本地机器上进行了 mongorestore 并看到丢失的文件。 (错过像 60%..)。 VM 内存为 500mb,而为该集合转储的 bson 仅为 600mb..

标签: mongodb mongodump database


【解决方案1】:

您有一个文件大小为 2GB 的数据库,但 MongoDB 以块(如 2GB)的形式分配数据文件,并且可能在一段时间内无法填充它们。您的数据库中可能只有 600MB 的数据(请参阅db.stats() 以获得一些指导)。您还应该注意,不会转储索引,只会转储它们用于在还原时重建的定义,因此删除这些将影响您的转储大小。由于您没有错误,我怀疑您在这里有一个完全有效的转储,它反映了 2GB 文件中实际存在的数据量。

如果我的 VM 有 500 mb 的内存,它能否成功转储 2GB 的文件?

是的,不过如果所有数据都可以放入内存会更快

【讨论】:

  • 但是500mb内存可以转储的文件大小有限制吗?
  • 不,它只需要在转储时从磁盘更多地在内存中分页,因为数据无法放入内存 - 没有限制
  • 当您运行 mongodump 时,它将遍历 _id 索引(将其分页到内存中)并使用它来转储实际数据(然后也将其分页到内存中)。如果您使用 _id,这实际上是一种预热数据集的快速方法。因此,如果 _id 索引和数据适合,特别是如果它们已经在内存中,它会快速快速地转出。如果它们不适合,那么后面的数据将被分页,较早的数据将被分页,结果转储会变慢,但即使数据超出内存仍会完成
  • 不,删除索引不会影响 mongodump,因为它只会转储很小的索引定义。您可以跳过执行索引扫描并强制执行表扫描,但这可能很危险,而且可能不会更快:docs.mongodb.org/manual/reference/program/mongodump/…
  • 不,它们不在数据库文件中,它们只是一系列 bson 编码的文档,在它们恢复之前你不能对它们运行任何 MongoDB 命令
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2017-04-10
  • 1970-01-01
  • 2015-01-19
  • 2020-03-08
相关资源
最近更新 更多