Mongo修复数据库副本失败



在将我的数据离线复制到另一台服务器后,所有服务器上都丢失了bomgar.1(一个数据文件)。我有大约850GB的数据在网格文件存储在这个数据库中。由于缺少文件,所有修复工具都失败了。我试图从另一台服务器(相同的数据库名称,相同的文件大小)复制一个"假"bomgar.1,这允许修复工具转储数据,但是当他们去插入有效的文档时(许多,许多小时后),我得到以下输出:

> use bomgar
switched to db bomgar
> db.repairDatabase()
{
        "ok" : 0,
        "errmsg" : "E11000 duplicate key error index: bomgar.fs.chunks.$files_id_1_n_1 dup key: { : null, : null }",
        "code" : 11000
}

我没有在Mongo shell中做很多事情。我对保留任何重复数据不感兴趣。"假"文件只有128MB,所以丢失那一小部分数据比丢失整个850GB要好得多。我们正在将这些数据移动到一个副本集,似乎没有一个服务器会显示fs。文件收集,给出错误bad offset:0 accessing file: /data/grid/bomgar.0. See http://dochub.mongodb.org/core/data-recovery,但我可以查看fs。块和系统索引。

总结:我如何保存我的数据,即使它的一部分丢失了?

最后,我最终使用mongodumpmongorestore,因为它们能够忽略重复,其中db.repairDatabase()在遇到重复时失败。我真的不知道为什么我从800GB的数据增加到2.2TB的数据,但我不能排除在我修复服务器时添加数据的可能性,为什么它变得如此巨大,这没有任何意义。我不能确定保留了多少数据,但我为阻止错误而添加的"假"切片似乎没有插入任何奇怪的文档,似乎使修复工具很高兴。幸运的是,我有相当多的硬盘空间可用于修复,比我预期的需要。

这个故事的寓意是遵守文档,不要将生产数据放在单个实例上,除非您准备丢失它!我真希望他们建议使用dump/restore而不是repairDatabase,因为我在那上面浪费了很多时间。

最新更新