今天公司的dba在內部分享了針對mysql上具體的每個crud語句操作如何進行控制管理(利用的inntop工具),挺好的。這裏,我也獻醜下,在mongodb中如何管理具體的每個crud操作(比如某個查詢語句慢,太佔資源,直接可以將其kill掉,這貌似很暴力哈,不過沒關係,有時候不得已而爲之...不過mongodb中可不是用第三方的工具哦,而是自家實現的功能)
currentOp是個好東西,顧名思義,就是當前的操作。在mongodb中可以查看當前數據庫上此刻的操作語句信息,包括insert/query/update/remove/getmore/command等多種操作。直接執行db.currentOp()一般返回一個空的數組,我們可以指定一個參數true,這樣就返回用戶connections與系統cmmand相關的操作。下面看個列子:
db.currentOp(true) 會返回很多信息,
{ "inprog" :
[
{
"opid" : 3434473,//操作的id
"active" : <boolean>,//是否處於活動狀態
"secs_running" : 0,//操作運行了多少秒
"op" : "<operation>",//具體的操作行爲,包括(insert/query/update/remove/getmore/command)
"ns" : "<database>.<collection>",//操作的命名空間,如:數據庫名.集合名
"query" : {//具體的操作語句
},
"client" : "<host>:<outgoing>",//連接的客戶端信息
"desc" : "conn57683",//數據庫連接描述
"threadId" : "0x7f04a637b700",//線程id
"connectionId" : 57683,//數據庫連接id
"locks" : {//鎖的相關信息
"^" : "w",
"^local" : "W",
"^<database>" : "W"
},
"waitingForLock" : false,//是否在等待並獲取鎖,
"msg": "<string>"
"numYields" : 0,
"progress" : {
"done" : <number>,
"total" : <number>
}
"lockStats" : {
"timeLockedMicros" : {//此操作獲得以下鎖後,把持的微秒時間
"R" : NumberLong(),//整個mongodb服務實例的全局讀鎖
"W" : NumberLong(),//整個mongodb服務實例的全局寫鎖
"r" : NumberLong(),//某個數據庫實例的讀鎖
"w" : NumberLong() //某個數據庫實例的寫鎖
},
"timeAcquiringMicros" : {//此操作爲了獲得以下的鎖,而耗費等待的微秒時間
"R" : NumberLong(),//整個mongodb服務實例的全局讀鎖
"W" : NumberLong(),//整個mongodb服務實例的全局寫鎖
"r" : NumberLong(),//某個數據庫實例的讀鎖
"w" : NumberLong()//某個數據庫實例的寫鎖
}
}
},
.....
]
}
注:
1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)
比如可以獲取當前操作中,
--已停止活動 並且操作行爲爲query的信息
db.currentOp(true).inprog.forEach(
function(opDoc){//opDoc其實是返回的每個op操作對象
if(!opDoc.active && opDoc.op=='query')
printjson(opDoc)
}
)
--正在進行中 並且操作行爲爲query的信息
db.currentOp(true).inprog.forEach(
function(opDoc){//opDoc其實是返回的每個op操作對象
if(opDoc.active && opDoc.op=='query')
printjson(opDoc)
}
)
通過以上監控如果發現某個操作比較慢,還可以對其進行kill:
db.killOp(opid) //kill當前的操作 opid爲具體的操作id號,當然了,只能kill正在進行中的