Назад | Перейти на главную страницу

Как найти / убить долго работающие скрипты mongo

Я думаю, что у меня есть давно работающий скрипт mongo, убирающий мою базу данных, но я не уверен. Я был подключен к серверу linux через SSH, и я запустил сценарий следующим образом:

mongo my_database my_script.js

Он начал пыхтеть, но это длилось слишком долго, поэтому я ударил Ctrl-C и упал обратно в оболочку. Я предполагал, что сценарий отключен, но теперь я вижу, что содержащиеся в нем запросы все еще выполняются в базе данных.

Как мне получить список скриптов, которые в настоящее время запущены в базе данных, и убить их? Я знаю о db.currentOp и db.killOp, но сами запросы выполняются быстро, мне нужно убить скрипт, выполняющий их в цикле.

Из этого: https://dba.stackexchange.com/questions/60029/how-do-i-safely-kill-long-running-operations-in-mongodb


Это может быть немного сложно, но тот факт, что оболочка MongoDB, по сути, является интерпретатором 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, и не затронет ничего, что работает с локальной базой данных, где находится журнал операций (и, следовательно, база данных, которая участвует в длительных операциях репликации. Относительно легко добавить критерии к внутренний if условный для более точного нацеливания операций по мере необходимости на основе конкретных потребностей.

Код также доступен в виде содержания (где я буду не забывать обновлять его на постоянной основе).


Это поможет вам нацелить определенные операции и прекратить их.