Answers:
这可能有点棘手,但是MongoDB shell基本上是Java解释器这一事实为我们提供了过滤方面的不错选择。这是我用来完成此任务的功能:
// kills long running ops in MongoDB (taking seconds as an arg to define "long")
// attempts to be a bit safer than killing all by excluding replication related operations
// and only targeting queries as opposed to commands etc.
killLongRunningOps = function(maxSecsRunning) {
currOp = db.currentOp();
for (oper in currOp.inprog) {
op = currOp.inprog[oper-0];
if (op.secs_running > maxSecsRunning && op.op == "query" && !op.ns.startsWith("local")) {
print("Killing opId: " + op.opid
+ " running over for secs: "
+ op.secs_running);
db.killOp(op.opid);
}
}
};
这只会杀死超过maxSecsRunning
阈值的查询,并且不会碰到任何针对local
数据库运行的查询,因为数据库是存在的oplog
地方(因此是长期运行复制操作所涉及的数据库。将条件添加到内部if
条件数据库相对容易根据特定需求更精确地定位所需的操作。
该代码也可以作为要点使用(我会记得在此不断进行更新)。
db.currentOp()
在我们的分片数据库上运行会返回“”命名空间(aka ns:“”)中的操作,这些操作使用“ repl writer worker n”(其中n是整数)的desc会运行很长时间。我建议您使用可能要杀死的查询将名称空间列入您的实际数据库白名单。喜欢的东西&& (['users', 'analytics'].indexOf(op.ns) != -1)
,而不是!op.ns.startsWith
条件。