【问题标题】:mongodb status of index creation job索引创建作业的mongodb状态
【发布时间】:2014-04-14 02:14:35
【问题描述】:

我正在使用 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。谢谢!

【问题讨论】:

  • db.my_collection.getIndexes() 向您展示了什么?索引是否已经创建?
  • 这个链接也不错:docs.mongodb.org/manual/tutorial/…
  • Anand - getIndexes() 列出新索引。但是,我不确定这是否意味着工作已完成。

标签: mongodb background indexing jobs


【解决方案1】:

您可以将 currentOptrue 参数一起使用,该参数会返回更详细的输出,包括空闲连接和系统操作。

db.currentOp(true)

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

【讨论】:

  • 谢谢 Cesar - 运行 db.currentOp(true) 返回相同的 {}。还有其他想法吗?
  • 谢谢大家的建议。经过大量搜索,我找到了this post!这阐明了在启用身份验证的环境中 db.currentOp() 仅适用于管理员用户,这些用户是在管理员数据库中进行身份验证的用户。一旦我使用了该用户,我就会看到命令的真实输出。
【解决方案2】:

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

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

输出:

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

【讨论】:

  • 这对我不起作用(什么都不打印),所以我将它修改为db.currentOp(true).inprog.forEach(function(op){ print(op.msg) }),现在它打印了额外的[unknown type] 行,但至少它也打印了索引构建百分比,这比 CesarTrigo 的 db.currentOp(true) 干净得多,打印的东西要多得多
  • 改用这个:db.currentOp({ "query.createIndexes": { $exists : true } }).inprog.forEach(function(op){ print(op.msg) })
【解决方案3】:

在 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%

【讨论】:

  • 我在我的 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" },
  • 对于分片集群:db.currentOp(true).inprog.forEach(function(op){ if(op.msg!==undefined) print(op.shard, op.msg) })
【解决方案4】:

不幸的是,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" },
【解决方案5】:

只检查单个索引的进度的简单方法:

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

输出:

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

【讨论】:

    【解决方案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/ }
          ]
        }
    )
    

    Active Indexing Operations example

    【讨论】:

    • 问题陈述:运行 db.currentOp() 返回 {}。那么这个答案不会也返回 {} 吗?
    【解决方案7】:

    查找索引作业的进度,很好的一个班轮:

    > 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
    ]
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2020-10-08
      • 2012-12-09
      • 1970-01-01
      • 2017-07-10
      相关资源
      最近更新 更多