我正在使用 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。谢谢!
在 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%
您可以将 currentOp 与 true 参数一起使用,该参数返回更详细的输出,包括空闲连接和系统操作。
db.currentOp(true)
...然后你可以使用 db.killOp() 来终止所需的操作。
以下内容应打印出索引进度:
db
.currentOp({"command.createIndexes": { $exists : true } })
.inprog
.forEach(function(op){ print(op.msg) })
输出:
Index Build (background) Index Build (background): 5311727/27231147 19%
我喜欢:
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({"msg":/Index/}).inprog[0].progress;
输出:
{ "done" : 86007212, "total" : 96868386 }
查找索引作业的进度,漂亮的一行:
> 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
]
要检查没有管理员权限的索引的构建状态,可以运行:
db.runCommand( { collStats : "CollectionName", scale: 1024 } );
结果可能包含一个
indexBuilds
数组,其中包含正在构建的所有当前索引。列出第一个:
> db.runCommand( { collStats : "CollectionName", scale: 1024 } ).indexBuilds[0];
myIndexName_1