mongodb系列~mongodb慢语句(2)
一簡介:今天遇到一個慢日志的排查和解決過程
二 版本:3.0.6
三 架構:分片集群
四 具體過程
? ? ?1 程序響應很慢,具體日志尋找定點sql(mongodb慢日志記錄在log日志里)
? ? ? ?awk '$NF~/ms$/{print $1,$NF}' shard2.log|sed 's/ms//g'|awk '$2 > 12000 {print $1,$2}' 這里我統計的是大于12S的,
? ? ?2 通過分析定位具體sql為查詢語句,條件是等值查詢
? ? ?3 獲取collection的所有索引
? ? ?db.chenfeng.getIndexes(); 可以發現并沒有查詢條件的字段為索引
? ? ?4? 在線添加索引
? ? ? db.chenfeng.ensureIndex({"riqi":1}) 在這時候發現一直在卡住
? ? ??mongo? --eval "printjson(db.currentOp())"? 發現此操作處于鎖等待狀態,于是改為后臺執行
? ? ???db.killOp(opid) 干掉進程(這里補充下,mongodb的session即便kill,也需要很久才能釋放,相當的無語_
? ? ?5 后臺添加索引
? ? ??db.chenfeng.ensureIndex({"riqi":1},{background:true})
? ? ? 這里要注意兩點
? ? ? ?1 后臺執行的意思是不阻塞DML操作,但是本身執行命令會卡住,所以我們采用nohup執行
? ? ? ? nohup??mongo? --eval "?db.chenfeng.ensureIndex({"riqi":1},{background:true})"? &
? ? ? ?2 處在后臺創建索引的進程是否完成,一定要依賴于explain 定位索引
? ? ? ? ??db.system.indexes.find()?db.chenfeng.getIndexes() 命令都可以查看后臺添加的索引,但是這并不代表已經完成,所以查詢語句依然會可能應用不到索引(我整整用了一下午排坑)
?
轉載于:https://www.cnblogs.com/danhuangpai/p/9135079.html
總結
以上是生活随笔為你收集整理的mongodb系列~mongodb慢语句(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Socket 编程概述
- 下一篇: Elasticsearch 参考指南(重