背景
我有一个目录,其中包含运行 MongoDB 3.4.x 的 mongod 上.gz
生成的文件,我正在使用. 除了一个之外,所有的都被正确加载。它们都需要 1 到 3 个小时来加载数据,然后再花费 2 到 4 个小时来重建索引。有问题的文件在下面的步骤之前挂起,我通常在大约一天后从外部终止该进程。我已经将场景重现了 4 或 5 次。mongodump
mongorestore ... --numInsertionWorkersPerCollection 8 --drop --nsFrom ... --nsTo ...
finished restoring database.collection (N documents)
在这段时间内,该mongorestore
进程仍然可以从 shell 中看到,但在 中没有相应的条目db.currentOp()
,并且数据库的大小没有增加。
这些错误是在日志行“从元数据恢复集合数据库的索引。集合”之前返回的:
2017-03-13T09:30:04.218-0400 demux namespaceHeader: {database collection true 726142452659775357}
2017-03-13T09:30:04.218-0400 demux checksum for namespace database.collection is correct (726142452659775357), 54599167880 bytes
2017-03-13T09:30:04.218-0400 demux finishing (err:corruption found in archive; I/O error reading length or terminator ( gzip: invalid header ))
我发现了一些关于 mongorestore 挂起的报告(例如),以及一些关于/
旧版本命名空间中 s 问题的文档(例如),但是我还没有找到关于我的情况的描述。
问题
现在我发现自己有一些迹象表明我加载的文件可能已损坏,或者至少有一个损坏的标题。向相关集合及其索引发出实际查询会返回看起来合理的结果。我怎样才能明确地检测或排除这种类型的“腐败”?在这种情况下,“腐败”究竟意味着什么?我可以期望在数据库中找到它,还是只能在 zip 文件中找到它?
更新:在@mustaccio 的建议下,我运行gzip -t
了有问题的文件,它报告了“尾随垃圾”。这是否足以将 MongoDB 报告的问题固定在错误的输入上并停止在数据库中查找损坏?
此错误消息是指处理 gzip 存档而不是其中的 BSON 数据。您的测试
gzip -t
暗示内容可能没问题,错误可能是由于存档末尾的可忽略填充造成的(请参阅:gzip 抱怨尾随垃圾被忽略)。如果问题很容易重现,我会在 MongoDB Jira TOOLS 项目中提出错误报告,其中包括更多详细信息,例如使用的和命令行参数的特定版本
mongodump
以及mongorestore
等待的时间。mongorestore
对这种情况进行某种超时或错误处理而不是无限期地挂起似乎是合理的;我也不希望mongodump
创建相同版本mongorestore
无法处理的文件。您不太可能能够将损坏的 BSON 文档恢复到 MongoDB,但可能存在一些细微差别,具体取决于数据损坏的方式/位置。在大多数情况下,当服务器尝试读取 BSON 时,无效数据会触发异常/断言,但有效的 BSON 并不一定意味着字段内容符合预期。
为了完全确定,您必须将恢复数据的文档计数或校验和与原始数据进行比较(假设您仍然有 gzip 存档以外的副本)。