MongoDB copyDatabase在前台而非后台上运行索引创建

时间:2012-07-25 12:31:15

标签: mongodb

我有700M行/1.3TB MongoDB实例,版本1.6.3。我尝试使用copyDatabase命令将其复制到新的2.0实例。

'只是复制'已经完成了2个小时。但在此之后,新的MongoDB集合被锁定,db.currentOp()返回低于结果。

{
    "opid" : 5,
    "active" : true,
    "lockType" : "write",
    "waitingForLock" : false,
    "secs_running" : 22138,
    "op" : "query",
    "ns" : "nerv",
    "query" : {
        "copydb" : 1,
        "fromhost" : "<some host>",
        "fromdb" : "<some db>",
        "todb" : "<some db>"
    },
    "client" : "127.0.0.1:50689",
    "desc" : "conn",
    "threadId" : "0x7f5094005700",
    "connectionId" : 1,
    "msg" : "index: (2/3) btree bottom up 214887968/715742197 30%",
    "progress" : {
        "done" : 214887968,
        "total" : 715742197
    },
    "numYields" : 5591738
},

我等了大约5个小时,它看起来不会在24小时内结束。我必须等待这个还是有其他选择吗? (比如在后台运行索引创建,与ensureIndex一样)


已添加)感谢您的回答,Adam C.然后我想问你更多:)

  1. index: (2/3) btree bottom up做什么以及为什么这么慢?
  2. 我还没有收到index: (3/3)条消息。 (3/3)慢与(2/3)相同吗?

1 个答案:

答案 0 :(得分:2)

除了二级问题,索引构建可以在后台完成,但不是我认为的副本的一部分:

http://www.mongodb.org/display/DOCS/Indexing+as+a+Background+Operation

您可以只是fsync并锁定(或暂时关闭)1.6.3数据库,然后复制数据文件。文件格式在1.6.3和2.0.6之间没有变化,所以如果启动2.0.6实例并将其指向复制文件的相应路径,那么你应该好好去。

就后续文章而言,这有点超出了我目前的知识,但我会尽力找出答案。我可以说相关代码在这里:

https://github.com/mongodb/mongo/blob/master/src/mongo/db/index_update.cpp#L219

看起来您正处于btree构建阶段(在读取/插入之后)阶段,其中正在创建实际索引数据结构,并且最终部分与提交相关。很难确定这里的确切时间,但如果你已经运行了一段时间,很有可能值得让它完成。

如果是我的选择,我会有一个计划B并且并行运行数据文件的副本,假设它是可能的。如果索引构建首先完成,则终止文件传输。

更新:我在研究另一个问题时意识到,当索引的集合远远大于RAM时,版本高达2.0.6存在错误。它表现为前景索引的第2阶段(你在做什么)需要很长时间,并且页面错误率大幅增加。

该错误在2.0.7中得到修复(截至编写此答案时,可作为候选版本提供)。所以,如果有其他人遇到此问题,或原始问题所有者遇到此问题,请确保您尝试使用2.0.7 +