首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到/杀死长时间运行的mongo脚本

问如何找到/杀死长时间运行的mongo脚本
EN

Server Fault用户
提问于 2014-03-28 14:30:20
回答 1查看 2.7K关注 0票数 2

我想我有一个长时间运行的芒果脚本在我的数据库,但我不确定。我通过SSH连接到linux服务器,运行脚本如下:

代码语言:javascript
复制
mongo my_database my_script.js

它开始嗡嗡作响,但花了太长时间,所以我击中了Ctrl-C,然后掉回了壳里。我以为脚本已经被删除了,但现在我看到的是它包含的查询仍然在数据库上运行。

如何获得数据库当前正在运行的脚本列表并杀死它们?我知道db.currentOp和db.killOp,但是实际的查询本身是快速的,我需要杀死循环中运行它们的脚本。

EN

回答 1

Server Fault用户

发布于 2016-06-17 13:04:01

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

这可能有点棘手,但实际上MongoDB外壳基本上是一个Javascript解释器,在过滤方面给我们提供了不错的选择。下面是我用来完成这个任务的函数:

代码语言: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所在的地方(因此也就是长期运行的复制操作所涉及的数据库)。如果有条件地根据特定需求向内部添加更精确的目标操作,那么向内部添加标准是相对容易的。

代码也可作为gist (我将记得不断更新它)。

这将帮助您针对特定的操作并终止相同的操作。

票数 -1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/585170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档