db.currentOp() 是 MongoDB shell 中用于查看当前正在执行的操作的命令。它返回一个文档,列出当前数据库实例中所有正在运行的操作的详细信息。这对于诊断性能问题和识别长时间运行的操作非常有用。
输出字段解释
db.currentOp() 返回的结果是一个包含操作信息的文档,具体字段可能包括:
opid: 操作 ID,唯一标识每个操作,可以用来终止特定操作。
active: 布尔值,指示操作是否正在运行。
secs_running: 操作已运行的时间(以秒为单位)。
microsecs_running: 操作已运行的时间(以微秒为单位)。
op: 操作类型,例如 query、insert、update 等。
ns: 操作涉及的命名空间(数据库和集合),格式为 database.collection。
query: 查询操作的详细信息,包括查询条件、排序、限制等。
client: 发起操作的客户端地址和端口。
conn: 操作连接的 ID。
locks: 锁信息,指示操作当前持有的锁。
waitingForLock: 布尔值,指示操作是否在等待锁。
msg: 额外的操作状态信息,例如 waiting for lock。
planSummary: 查询计划的简要描述。
numYields: 操作已发生的上下文切换次数。
locksHeld: 操作当前持有的锁的详细信息。
locksPending: 操作当前等待的锁的详细信息。
示例输出
以下是 db.currentOp() 返回结果的示例及解释:
{
"inprog": [
{
"opid": 12345,
"active": true,
"secs_running": 120,
"microsecs_running": NumberLong(120000000),
"op": "query",
"ns": "mydb.mycollection",
"query": {
"find": "mycollection",
"filter": {
"status": "active"
},
"limit": 10,
"sort": {
"created_at": -1
}
},
"client": "192.168.1.100:27017",
"conn": 987,
"locks": {
"Global": "r",
"Database": "r",
"Collection": "r"
},
"waitingForLock": false,
"msg": "",
"planSummary": "COLLSCAN",
"numYields": 5,
"locksHeld": {
"r": [
"Global",
"Database",
"Collection"
]
},
"locksPending": {}
}
]
}
详细解释
opid: 操作 ID 为 12345。
active: 操作正在运行。
secs_running: 操作已运行 120 秒。
microsecs_running: 操作已运行 120,000,000 微秒。
op: 操作类型为 query。
ns: 操作涉及的命名空间为 mydb.mycollection。
query: 查询的详细信息,包括查找集合 mycollection,过滤条件为 status: “active”,限制返回 10 条记录,并按 created_at 字段降序排序。
client: 发起操作的客户端地址和端口为 192.168.1.100:27017。
conn: 操作连接 ID 为 987。
locks: 操作当前持有的锁,包括全局读锁(Global: “r”)、数据库读锁(Database: “r”)和集合读锁(Collection: “r”)。
waitingForLock: 操作没有在等待锁。
msg: 无额外的操作状态信息。
planSummary: 查询计划为集合扫描(COLLSCAN)。
numYields: 操作已发生 5 次上下文切换。
locksHeld: 当前持有的锁为全局读锁、数据库读锁和集合读锁。
locksPending: 没有等待的锁。
终止特定操作
使用 db.killOp() 终止特定操作:
db.killOp(12345)
以上就是 db.currentOp() 的详细解释及如何使用它来监控和管理 MongoDB 中的当前操作。