我有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.然后我想问你更多:)
index: (2/3) btree bottom up
做什么以及为什么这么慢?index: (3/3)
条消息。 (3/3)
慢与(2/3)
相同吗?答案 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 +