终止正在运行的操作
为了终止正在执行的操作,MongoDB 提供了两种方法:maxTimeMS()
和db.killOp()
。根据需要,使用这些操作来控制 MongoDB 部署中的操作行为。
从 mongosh
中,使用以下方法为此查询设置 30 毫秒的时间限制:
db.location.find( { "town": { "$regex": "(Pine Lumber)", "$options": 'i' } } ).maxTimeMS(30)
您可以将 maxTimeMS
字段添加到命令文档中,以便将操作的时间限制设置为 45 毫秒:
db.runCommand( { distinct: "collection", key: "city", maxTimeMS: 45 } )
killOp
db.killOp()
方法在下一个中断点中断正在运行的操作。db.killOp()
按操作 ID 标识目标操作。
db.killOp(<opId>)
终止正在运行的操作时要格外小心。仅使用 db.killOp()
来终止客户端发起的操作,不要终止数据库内部操作。
分片集群
{ $currentOp: { allUsers: <boolean>, idleConnections: <boolean>, idleCursors: <boolean>, idleSessions: <boolean>, localOps: <boolean> } }
#allUsers:如果设置为 false
,$currentOp
仅报告属于运行该命令的用户的操作/空闲连接/空闲游标/空闲会话。
#idleSessions
#localOps:布尔值。如果将在 mongos
上运行的聚合设置为true ,则 $currentOp
仅报告在该 mongos
上本地运行的操作。如果是 false
,则 $currentOp
报告在分片上运行的操作。
currentOp操作会输出很多东西,可根据字段筛选一些需要的出来
$currentOp.opid
该操作的标识符。您可以将此值传递给db.killOp() 中的 ,以终止操作。
$currentOp.microsecs_running 操作的持续时间(以微秒计)。MongoDB 通过从操作开始时间减去当前时间来计算此值。
$currentOp.secs_running 操作的持续时间(以秒计)。MongoDB 通过从操作开始时间减去当前时间来计算此值。
mongos> db.aggregate( [ ... { $currentOp : { allUsers: true, idleConnections: false } }, ... { $match : { ns: "vinodh.testColl", microsecs_running: {$gt: 10000} }}, ... {$project: { _id:0, host:1, opid:1, secs_running: 1, op:1, ns:1, waitingForLock: 1, numYields: 1 } } ] ) { "host" : "bm-support01.bm.int.percona.com:54012", "opid" : "shard01:777387", "secs_running" : NumberLong(0), "op" : "insert", "ns" : "vinodh.testColl", "numYields" : 0, "waitingForLock" : false }
#$project:value值为0抑制字段输出,为1,允许字段输出。
var ops = db.currentOp().inprog; for(i = 0; i < ops.length; i++){ var opid = ops[i].opid; db.killOp(opid); print("Stopping op #"+opid) } mongo 10.9.1.1:27107/admin -u root -p '1111'< /tmp/kill.js
一些常用的字段
locks
waitingForLock