currentOp 与 killOp
db.currentOp() 列出当前正在执行的操作,可以按时长、命名空间、操作类型过滤,是排查「数据库卡住了」的第一入口:能看到慢查询、锁等待、长时间运行的 DDL。确认某个操作确实该停时,用 db.killOp(opid) 终止它。默认只返回活动操作与系统操作,空闲连接需要显式加 $all: true 才会出现。
基本信息
| 查看 | db.currentOp({ "secs_running": { $gte: 3 }, "active": true }) |
|---|---|
| 终止 | db.killOp(<opid>) |
| 权限要求 | 查看需 inprog 权限,终止需 killop 权限 |
| 默认范围 | 活动操作与系统操作;加 $all: true 才包含空闲连接 |
| 分片集群 | 在 mongos 上执行会向下推送,输出包含各分片的操作信息 |
典型使用场景
- 定位长跑查询:按 secs_running 过滤,先看谁在占资源
- 找锁等待:关注 waitingForLock 与锁类型,判断是否被 DDL 阻塞
- 索引构建与 DDL 进度:查看 build 类操作的耗时与状态
- 发现漏索引查询:看 planSummary 是否为 COLLSCAN
- 连接与线程排查:加 $all 后按 client 过滤,确认连接来源与空闲情况
- 批量终止前的确认:先统计影响面,再按 opid 逐个处理
常用查询与终止
常用查询与终止
// 运行超过 5 秒且处于活动状态的操作
db.currentOp({ "secs_running": { $gte: 5 }, "active": true })
// 只看某个集合上的操作,并挑出关键字段
db.currentOp({ ns: /^app\.orders/, secs_running: { $gte: 2 } }).inprog.map(function (o) {
return { opid: o.opid, op: o.op, ns: o.ns, secs: o.secs_running, plan: o.planSummary, client: o.client }
})
// 包含空闲连接,便于查连接来源
db.adminCommand({ currentOp: 1, $all: true, "client": "10.0.0.21:51022" })
// 确认影响面后终止;注意它是安全点终止,未必立即生效
db.killOp(123456789)输出字段读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| opid | 操作唯一标识 | killOp 参数,终止前后各记录一次便于核对 |
| op | 操作类型(query / update / insert / command / getmore) | getmore 多属游标读取,属正常现象 |
| ns | 命名空间(库.集合) | 按集合聚类就能看出热点 |
| secs_running | 已运行秒数 | 秒级阈值按业务预期设定 |
| planSummary | 执行计划摘要 | 出现 COLLSCAN 说明未命中索引 |
| waitingForLock / waitingForFlowControl | 等待锁或流控 | 持续等待要找出持锁方或写入压力来源 |
| desc / msg | 操作来源描述 | 可用于排除复制线程等内部操作 |
先看再杀:终止前把 ns、op、secs_running 与 planSummary 记下来,既能判断该不该杀,也为后续补索引或改写查询留下依据。
killOp 只在安全点生效:长事务、索引构建等操作可能延迟一段时间才真正停止,批量终止前务必确认影响面。