MongoDB索引创建作业的状态

63

我正在使用MongoDB,并且有一个包含大约7500万条记录的集合。我已经使用以下命令在两个“字段”上添加了一个复合索引:

db.my_collection.ensureIndex({"data.items.text":1, "created_at":1},{background:true}).

两天后,我正在尝试查看索引创建的状态。运行db.currentOp()返回{},但是当我尝试创建另一个索引时,出现了这个错误消息:

cannot add index with a background operation in progress.

有没有一种方法可以检查索引创建作业的状态/进度?

还有一点要补充-我正在使用mongodb版本2.0.6。谢谢!


1
db.my_collection.getIndexes() 显示了什么?索引已经被创建了吗? - Anand Jayabalan
这也是一个不错的链接:http://docs.mongodb.org/manual/tutorial/manage-in-progress-indexing-operations/ - Sammaye
2
Anand - getIndexes() 列出了新索引。但是,我不确定它是否意味着作业已完成。 - Yair Avgar
根据我刚刚的经历和在这里阅读到的内容,如果一个索引出现在集合下面,这并不意味着工作已经完成。我的理解正确吗? - Guy_g23
7个回答

74
在Mongo shell下,输入以下命令以查看当前进度:

在Mongo shell下,输入以下命令以查看当前进度:

rs0:PRIMARY> db.currentOp(true).inprog.forEach(function(op){ if(op.msg!==undefined) print(op.msg) })

Index Build (background) Index Build (background): 1431577/55212209 2%

要做一个实时运行状态日志:

> while (true) { db.currentOp(true).inprog.forEach(function(op){ if(op.msg!==undefined) print(op.msg) }); sleep(1000); }
Index Build: scanning collection Index Build: scanning collection: 43687948/47760207 91%
Index Build: scanning collection Index Build: scanning collection: 43861991/47760228 91%
Index Build: scanning collection Index Build: scanning collection: 44993874/47760246 94%
Index Build: scanning collection Index Build: scanning collection: 45968152/47760259 96%

1
我在mongo shell中输入了这个,但没有输出。而如果我只是输入了db.currentOp(),它会输出"inprog":[{"host":"ip-172-31-18-127:27017", "desc":"conn28","connectionId":28,"client":"127.0.0.1:34690","appName":"MongoDB Shell","clientMetadata":{"application":{"name":"MongoDB Shell"}}, - imin
1
对于分片集群: db.currentOp(true).inprog.forEach(function(op){ if(op.msg!==undefined) print(op.shard, op.msg) }) - Martin P.
我只看到“索引构建:在构建过程中接收的写入正在被排空” - 有什么想法吗? - Hackeron
这也适用于 Azure Cosmos DB for MongoDB。 - Abu Sufian

15

您可以使用带有true参数的currentOp,该参数返回更详细的输出,包括空闲连接和系统操作。


db.currentOp(true)

...然后您可以使用db.killOp()来终止所需的操作。


谢谢Cesar - 运行db.currentOp(true)返回相同的{}。还有其他想法吗? - Yair Avgar
3
感谢大家提供的建议。经过更多搜索,我找到了这篇文章!它澄清了在启用身份验证的环境中,db.currentOp()仅适用于管理员用户,这些用户需要进行管理员数据库的身份验证。一旦我使用了该用户,就可以看到命令的真实输出。 - Yair Avgar

14
以下内容应该会打印出索引进度:

以下内容应该会打印出索引进度:

db
  .currentOp({"command.createIndexes": { $exists : true } })
  .inprog
  .forEach(function(op){ print(op.msg) })

输出:

Index Build (background) Index Build (background): 5311727/27231147 19%

1
那对我没用(什么也没输出),所以我修改了它为 db.currentOp(true).inprog.forEach(function(op){ print(op.msg) }),现在它打印出了额外的 [未知类型] 行,但至少它打印出了索引构建百分比,这要比 CesarTrigo 的 db.currentOp(true) 清晰得多,后者打印了更多的东西。 - Computer's Guy
请使用以下代码: db.currentOp({ "query.createIndexes": { $exists : true } }).inprog.forEach(function(op){ print(op.msg) }) - Corvin

14

很不幸,DR9885 的回答对我没用,它的代码中有空格(语法错误),即使移除了这些空格,它也没有返回任何结果。

这在 Mongo Shell v3.6.0 上是有效的。

db.currentOp().inprog.forEach(function(op){ if(op.msg) print(op.msg) })

在我发表回答之前,我没有看过Bajal的回答,但它几乎完全相同,只是代码稍微更短并且也有效。


我在mongo shell里输入了这个命令,但没有输出。如果我只输入 db.currentOp(),它会输出 "inprog" : [ { "host" : "ip-172-31-18-127:27017", "desc" : "conn28", "connectionId" : 28, "client" : "127.0.0.1:34690", "appName" : "MongoDB Shell", "clientMetadata" : { "application" : { "name" : "MongoDB Shell" }, - imin

6

我喜欢:

db.currentOp({ 
    'msg' :{ $exists: true },
    'command': { $exists: true },
    $or: [ 
        { 'command.createIndexes': { $exists: true } }, 
        { 'command.reIndex': { $exists: true } }
    ]
}).inprog.forEach(function(op) { 
    print(op.msg); 
});

输出示例:

索引建立索引:84826/335739 25%

文档建议:

db.adminCommand(
    {
      currentOp: true,
      $or: [
        { op: "command", "command.createIndexes": { $exists: true }  },
        { op: "none", "msg" : /^Index Build/ }
      ]
    }
)

活动索引操作示例


问题陈述:运行db.currentOp()返回{}。那么这个答案不也会返回{}吗? - NealWalters

3

简单的进度检查,只是检查单个索引的进度:

db.currentOp({"msg":/Index/}).inprog[0].progress;

输出:

{ "done" : 86007212, "total" : 96868386 }

我刚刚遇到了未捕获的异常:TypeError: db.currentOp(...).inprog[0] 未定义: - Hackeron

1

查找指数作业进度,一个简洁的代码行:

> db.currentOp().inprog.map(a => a.msg)
[
    undefined,
    undefined,
    undefined,
    undefined,
    undefined,
    undefined,
    "Index Build: scanning collection Index Build: scanning collection: 16448156/54469342 30%",
    undefined,
    undefined
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接