Catch-22:mongo无法修复数据库,因为没有足够的磁盘空间?

时间:2015-01-12 16:26:11

标签: mongodb mongodb-query database nosql

我正在从转储文件恢复Mongo数据库并遇到问题。我无法修复数据库,因为没有足够的可用空间,现在我被卡住了。

所以我导入了1000万行,现在我想在集合上创建一个索引。但是当我尝试创建索引时,Mongo错误 - 没有足够的可用内存。

所以我决定删除一半的行然后回收可用空间:

> for (var v = db.page_statistics.find().sort({_id:1}).limit(5000000);v.hasNext();) { 
    db.page_statistics.remove(v.next()); 
}
> db.govuk_info_page_statistics.count();
5828632 # this worked, only 5 milion rows left

接下来,我尝试运行数据库修复以回收可用空间:

> db.repairDatabase();
{
    "ok" : 0,
    "errmsg" : "Cannot repair database backdrop having size: 19268632576 (bytes) because free disk space is: 9958019072 (bytes)"
}

我该怎么办?我无法在不运行数据库修复的情况下回收足够的磁盘空间来创建索引,但我还没有足够的磁盘空间来运行修复,所以我陷入了陷阱22。

2 个答案:

答案 0 :(得分:3)

要修复数据库,您的磁盘空间应该是现有数据库的两倍。 在修复数据库操作中,mongodb修复数据文件并将修复的文件保存在另一个位置,即它创建现有数据文件的副本。因此,没有足够的磁盘空间,您无法修复数据库。

答案 1 :(得分:2)

如果可能,您可以创建副本集,并且复制成员将回收可用空间。

然后,您可以使用主要服务器停止mongod,并删除数据文件。

再次启动mongod时,此服务器将从新服务器复制数据,并且文件大小较小(或考虑到您的数据,至少尽可能小)。