MongoDB profiler慢查询日志

在查询记录方面,MySQL有slowlog和general log,而MongoDB同样可以使用profiler来记录操作日志。不同的是,profiler要么记录所有操作日志,或者慢查询日志,而不能想MySQL一样slow log和general log分开设置。

profiler的概念:
1.慢查询阈值,slowms;
2.profiling级别,可分为0,1,2三级;0表示关闭profiler,如果设置了slowms,即使关闭profiler也会将慢查询记录到运行日志中;1表示开启profiler并记录超过慢查询阈值的操作;2表示记录所有操作;
3.sampleRate抽样比例,记录慢查询的随机抽样比例;
4.system.profile表,用于存储profiler记录的操作,在开启profiler的Database下面会有一个system.profile表;

一、开启profiler
1.1 database级别,即只开启该库的profiler
user test–进入test库
db.setProfilingLevel(2)–开启profiler并设置为2级别
返回结果如下:
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
was显示上一个profiler的级别;slowms显示慢查询阈值,默认是100ms;sampleRate表示慢查询抽样比例;ok表示是否执行成功。
db.setProfilingLevel(1, { slowms: 20, sampleRate: 0.42 })–设置slowms和sampleRate
1.2 instance级别,即开启整库的profiler
开启整库profiler需要在实例启动时指定参数:
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5
或在配置文件中设置以下参数:

operationProfiling:
   mode: 
   slowOpThresholdMs: 
   slowOpSampleRate: 

1.3查看profiler级别和状态
db.getProfilingLevel()
db.getProfilingStatus()

二、查看profiler记录的日志
1.可以查看运行日志,其中同样会记录超过slowms的慢查询日志;
2.通过查询具体database下面的system.profile表,例如
查看最近10条慢查询:
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
查看command类型的慢查询:
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()
查看mydb.test表相关的慢查询:
db.system.profile.find( { ns : 'mydb.test' } ).pretty()
查看查询时间超过5ms的查询日志:
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()
按照时间范围查看慢查询:

db.system.profile.find({
  ts : {
    $gt: new ISODate("2012-12-09T03:00:00Z"),
    $lt: new ISODate("2012-12-09T03:40:00Z")
  }
}).pretty()

三、profiler注意事项
1.db.setProfilingLevel(1)是针对当前数据库开启profiler,同样的db.system.profile.find()也是针对当前数据库的system.profile进行查询,其中只记录当前数据库表相关的慢查询记录。
踩坑:发现运行日志中记录有慢查询,但是db.system.profile.find()却查不出相关的信息,后来才发现,并没有进入慢查询相关的数据库,而是直接在admin数据库下面执行db.system.profile.find()了,那么当然也就是只返回admin数据库相关的慢查询了。
2.system.profile表是capped collection,特点是固定大小,默认最大能到1M,在达到空间上限时会覆盖最早的数据。
踩坑:查不出较早一段时间的慢查询日志,但是在运行日志中存在。
针对capped collection,默认1M太小了,如何改变上限?
1.关闭profiler;
2.删除system.profile表;
3.以想要的空间上限创建一个新的system.profile表;
4.开启profiler。
例如将system.profile表改成5M上限:

db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:5000000 } )
db.setProfilingLevel(1)

如果想要在复制集的从库中修改system.profile表空间上限,可以先把从库退出复制集,然后以单机模式启动,再执行以上步骤,修改后作为从库从新加入复制集。

你可能感兴趣的:(MongoDB)