我需要恢复使用 mongodump 实用程序获取的大量转储。由于集合很大,并且 mongorestore 在后台重建索引,因此索引构建需要很长时间才能完成。我想要以某种方式让 mongorestore 在前台构建索引,以便索引构建花费更少的时间完成。
我知道我可以使用--noIndexRestore
忽略索引,但之后我必须逐个构建索引,这又是一个问题。我正在寻找使用 mongorestore 实用程序加速索引构建的最佳方法。
答案1
恢复后,后台只会构建最初创建的索引{background: true}
(因此在集合中设置了该选项)。转储数据库后,文件中将包含数据,文件中将包含元数据(要构建的索引)。与 BSON 文件不同,JSON 元数据只是文本,可以在恢复之前进行修改。system.indexes
name.bson
name.metadata.json
作为测试,我创建了一个集合,除了默认的字段和字段上的foo.bar
索引外,还添加了 2 个附加索引。这是我转储文件后在 foo 文件夹中的样子:a
b
bar.metadata.json
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "foo.bar" }, { "v" : 1, "key" : { "a" : 1 }, "name" : "a_1", "ns" : "foo.bar" }, { "v" : 1, "key" : { "b" : 1 }, "name" : "b_1", "ns" : "foo.bar", "background" : true } ] }
您可以使用您最喜欢的编辑器“修复”此问题,然后, "background" : true
使用查找和替换或类似方法删除。或者您可以使用sed
一行代码,例如:
sed 's/, "background" : true//g' bar.metadata.json
正如预期,结果如下:
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "foo.bar" }, { "v" : 1, "key" : { "a" : 1 }, "name" : "a_1", "ns" : "foo.bar" }, { "v" : 1, "key" : { "b" : 1 }, "name" : "b_1", "ns" : "foo.bar" } ] }
我使用上述 bar.metadata.json 文件测试了恢复,我的索引不再在后台创建,并且不再被标记为这样system.indexes
。