數(shù)據(jù)庫分析器:
? ? ? ? ?數(shù)據(jù)庫分析器(Database Profiler)收集有關(guān)針對的mongod實例運行操作命令的詳細信息。探查器的輸出可幫助識別效率低下的查詢和操作,這包括CRUD操作以及配置和管理命令。
? ? ? ? 分析器(Profiler)將收集到的所有信息寫入system.profile集合,Profile集合是個有固定大小的集合(默認1M),支持基于插入順序的插入和檢索文檔的高吞吐量操作。Profile集合的工作方式類似于循環(huán)緩沖區(qū):一旦集合填滿了它所分配的空間,它就會重寫集合中最舊的文檔,從而為新文檔騰出空間。
慢查詢:
? ? ? ? 我們將超過指定時間的查詢稱為“慢查詢”。 在MongoDB中你可以設(shè)置一個查詢時長的限額值來確定是否是慢查詢,默認是100毫秒。通過這些慢查詢你可以方便的監(jiān)測這些查詢是否使用了全集合掃描或者索引掃描。
? ? ? ?MongoDB的數(shù)據(jù)庫分析器默認是關(guān)閉的。長時間開啟會對數(shù)據(jù)庫有性能方面的影響,所以最好是使用完性能分析后,將此功能關(guān)閉,以避免以數(shù)據(jù)庫性能造成影響。
分析器開啟:
語法:
db.setProfilingLevel(<level>, <options>)
參數(shù):
參數(shù) | 類型 | 描述 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
level |
integer
|
配置分析器級別。提供以級別:
? |
||||||||
options | document or integer |
可選的。接受整數(shù)或配置文檔。如果將整數(shù)值作為
|
?
返回
該方法返回一個包含先前設(shè)置值的文檔。
- 單機版
- 副本集成員
- mongos實例
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1572991238, 1), "signature" : { "hash" : BinData(0,"hg6GnlrVhV9MAhwWdeHmHQ4T4qU="), "keyId" : NumberLong("6755945537557495811") } }, "operationTime" : Timestamp(1572991238, 1) }
{ "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1, "operationTime" : Timestamp(1572991499, 2), "$clusterTime" : { "clusterTime" : Timestamp(1572991499, 2), "signature" : { "hash" : BinData(0,"nhCquIxUw7thlrBudXe3PnsnvP0="), "keyId" : NumberLong("6755946491040235540") } } }
說明:
was
是上一個 level?設(shè)置。slowms
是先前的 slowms 設(shè)置。sampleRate
是先前的?sampleRate設(shè)置。filter
?是先前的?filter?設(shè)置. (New in MongoDB 4.4.2)note
是解釋 filter 行為的字符串。此字段僅在filter也出現(xiàn)時出現(xiàn)在輸出中. (New in MongoDB 4.4.2)
?
要查看當前配置級別,請參閱db.getProfilingStatus()
。
使用示例:
# 為所有數(shù)據(jù)庫開啟慢查詢記錄
db.setProfilingLevel(2)
# 指定數(shù)據(jù)庫,并指定閾值慢查詢 ,超過20毫秒的查詢被記錄
use test
db.setProfilingLevel(1, { slowms: 20 })
# 隨機采集慢查詢的百分比值,sampleRate 值默認為1,表示都采集,0.42 表示采集42%的內(nèi)容。
db.setProfilingLevel(1, { sampleRate: 0.42 })
#記錄所有操作日志,過濾查詢操作超過2秒的
db.setProfilingLevel( 2, { filter: { op: "query", millis: { $gt: 2000 } } } )
# 查詢慢查詢級別和其它信息
db.getProfilingStatus()
# 僅返回慢查詢級別
db.getProfilingLevel()
?
分析日志查詢:
# 查詢最近的10個慢查詢?nèi)罩?db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
# 查詢除命令類型為 ‘command’ 的日志
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()
# 查詢數(shù)據(jù)庫為 mydb 集合為 test 的 日志
db.system.profile.find( { ns : 'mydb.test' } ).pretty()
# 查詢 低于 5毫秒的日志
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()
# 查詢時間從 2012-12-09 3點整到 2012-12-09 3點40分之間的日志
db.system.profile.find({
ts : {
$gt: new ISODate("2012-12-09T03:00:00Z"),
$lt: new ISODate("2012-12-09T03:40:00Z")
}
}).pretty()
# 下面的示例查看時間范圍,將用戶字段從輸出中刪除以使其更容易閱讀,并根據(jù)每個操作運行的時間對結(jié)果進行排序
db.system.profile.find({
ts : {
$gt: new ISODate("2011-07-12T03:00:00Z"),
$lt: new ISODate("2011-07-12T03:40:00Z")
}
}, { user: 0 }).sort( { millis: -1 } )
system.profile集合字段解析:
{
"op" : "query", # 操作類型,值可為command、count、distinct、geoNear、getMore、group、insert、mapReduce、query、remove、update
"ns" : "test.report", # 操作的數(shù)據(jù)庫和集合
"command" : { # 命令
"find" : "report", # 操作的集合
"filter" : { "a" : { "$lte" : 500 } }, # 查詢條件
"lsid" : {
"id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9") #用戶的會話id
},
"$db" : "test" # 操作的數(shù)據(jù)庫
},
"cursorid" : 33629063128, # query和getmore 的游標id
"keysExamined" : 101, # MongoDB為執(zhí)行操作而掃描的索引鍵的數(shù)量
"docsExamined" : 101, # MongoDB為了執(zhí)行操作而掃描的集合中的文檔數(shù)。
"numYield" : 2, # 讓步次數(shù),操作時讓其他的操作完成的次數(shù)。
"nreturned" : 101, # 操作返回的文檔數(shù)
"queryHash" : "811451DD", # 查詢的hash值
"planCacheKey" : "759981BA",
"locks" : { # 操作期間的鎖和所的類型
"Global" : { #表示全局鎖定
"acquireCount" : { #鎖定的次數(shù)
"r" : NumberLong(3) # 表示共享鎖
}
},
"Database" : { # 數(shù)據(jù)庫鎖
"acquireCount" : { "r" : NumberLong(1) },
"acquireWaitCount" : { "r" : NumberLong(1) },
"timeAcquiringMicros" : { "r" : NumberLong(69130694) }
},
"Collection" : { # 集合鎖
"acquireCount" : { "r" : NumberLong(1) }
}
},
"storage" : { # 儲存
"data" : {
"bytesRead" : NumberLong(14736), #操作 從磁盤放到緩存的數(shù)據(jù)的字節(jié)數(shù)
"timeReadingMicros" : NumberLong(17) # 操作 花費在磁盤讀取的時間,以微妙為單位
}
},
"responseLength" : 1305014, # 操作返回結(jié)果的文檔長度,單位為字節(jié)
"protocol" : "op_msg", # 消息的協(xié)議
"millis" : 69132, # 從 MongoDB 操作開始到結(jié)束耗費的時間
"planSummary" : "IXSCAN { a: 1, _id: -1 }", # 摘要
"execStats" : { # 操作執(zhí)行過程中的詳細信息
"stage" : "FETCH", # 操作形式 ,COLLSCAN 用于集合掃描,IXSCAN 用于掃描索引鍵,F(xiàn)ETCH 用于檢索文檔
"nReturned" : 101, # 返回的文檔數(shù)量
"executionTimeMillisEstimate" : 0,
"works" : 101,
"advanced" : 101,
"needTime" : 0,
"needYield" : 0,
"saveState" : 3,
"restoreState" : 2,
"isEOF" : 0,
"invalidates" : 0,
"docsExamined" : 101,
"alreadyHasObj" : 0,
"inputStage" : {
...
}
},
"ts" : ISODate("2019-01-14T16:57:33.450Z"), #操作的時間戳
"client" : "127.0.0.1", # 客戶端的ip
"appName" : "MongoDB Shell", #客戶端應(yīng)用標識符
"allUsers" : [
{
"user" : "someuser", # 用戶
"db" : "admin" # 驗證的數(shù)據(jù)庫
}
],
"user" : "someuser@admin" # 經(jīng)過驗證的用戶
}
分析器關(guān)閉:
use test
db.setProfilingLevel(0)
?
改變分析器集合的大?。?/h2>
db.setProfilingLevel(0)
db.system.profile.drop()
# 創(chuàng)建4M大小的集合
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)
db.setProfilingLevel(0)
db.system.profile.drop()
# 創(chuàng)建4M大小的集合
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)
?
參考文獻:
https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/
https://www.cnblogs.com/operationhome/p/10728654.html
本文摘自 :https://blog.51cto.com/h