如何查找/终止长期运行的 mongo 脚本

如何查找/终止长期运行的 mongo 脚本

我认为我有一个长期运行的 mongo 脚本正在拖累我的数据库,但我不确定。我通过 SSH 连接到 Linux 服务器,并按如下方式运行脚本:

mongo my_database my_script.js

它开始运行,但耗时太长,所以我点击Ctrl-C并返回到 shell。我以为脚本已被终止,但现在我看到它包含的查询仍在数据库上运行。

如何获取数据库当前正在运行的脚本列表并终止它们?我知道和db.currentOpdb.killOp但实际查询本身很快,我需要终止循环运行它们的脚本。

答案1

由此:https://dba.stackexchange.com/questions/60029/how-do-i-safely-kill-long-running-operations-in-mongodb


这可能有点棘手,但 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 条件添加条件相对容易,可以更精确地定位所需的操作。

该代码也可作为要点(我会记得持续更新它)。


这将帮助您定位特定操作并终止其执行。

相关内容