web-dev-qa-db-ja.com

MongoDBで長時間実行されている操作を(安全に)強制終了するにはどうすればよいですか?

MongoDBでは操作が制御不能になり、最終的に数百秒間実行され、強制終了または完了するまでパフォーマンスに影響を与える場合があります。

それが発生したとき、私は killOp() が利用可能であることを知っていますが、レプリケーションに関係する長時間実行オペレーション(たとえば)を強制終了せずに、対象長時間実行オペレーションのみを強制終了する方法(どちらが危険な場合がありますか?)

11
Adam C

これは少し難しいかもしれませんが、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しきい値を超えるクエリのみが強制終了され、localが存在するoplogデータベースに対して実行されているものには影響しません(したがって、データベースが関係します)特定のニーズに基づいて必要に応じて操作をより正確に対象とするために、条件を内側のifに追加するのは比較的簡単です。

このコードは a Gist としても入手できます(継続的に更新することを覚えています)。

15
Adam C