我认为我有一个长期运行的 mongo 脚本正在拖累我的数据库,但我不确定。我通过 SSH 连接到 Linux 服务器,并按如下方式运行脚本:
mongo my_database my_script.js
它开始运行,但耗时太长,所以我点击Ctrl-C
并返回到 shell。我以为脚本已被终止,但现在我看到它包含的查询仍在数据库上运行。
如何获取数据库当前正在运行的脚本列表并终止它们?我知道和db.currentOp
,db.killOp
但实际查询本身很快,我需要终止循环运行它们的脚本。
答案1
这可能有点棘手,但 MongoDB shell 基本上是一个 Javascript 解释器,这为我们提供了不错的过滤选项。这是我用来实现这一点的函数:
// 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 阈值的查询,而不会影响针对本地数据库运行的任何操作,本地数据库是 oplog 所在的位置(因此是涉及长时间运行的复制操作的数据库)。根据特定需求,向内部 if 条件添加条件相对容易,可以更精确地定位所需的操作。
该代码也可作为要点(我会记得持续更新它)。
这将帮助您定位特定操作并终止其执行。