MongoDB慢日志查询分析

文章目录

  • 一、开启Profiling慢日志
    • 1)开启Profiling的三种方式
      • 1、全局开启Profiling
      • 2、配置文件设置开启
      • 3、mongo shell设置开启
    • 2)Profiling的级别
    • 3)Profile的相关信息解释
    • 4)查询Profile记录语句
    • 5)清除Profile慢日志并查看配置

一、开启Profiling慢日志

1)开启Profiling的三种方式

1、全局开启Profiling

如果想要全局开启Profiling,则可以在mongod启动时加上参数

1
mongod --profile 1 --slowms100         # 1表示追踪级别,100表示慢查询判定时间(ms)

2、配置文件设置开启

配置文件添加如下配置:

1
2
3
    operationProfiling:
    slowOpThresholdMs: 100
    mode: slowOp

3、mongo shell设置开启

mongo shell进行实时配置,命令如下:

1
2
    > db.setProfilingLevel(1,200)          ---1表示level,200表示慢查询时间(ms),也可以省略时间设置
    { "was" : 1, "slowms" : 100, "ok" : 1 }     ---100表示之前的慢查询时间设定值
1
2
    > db.getProfilingStatus()               ---查询当前慢查询的状态信息
    { "was" : 1, "slowms" : 200 }          ---was后的值表示级别
1
2
    > db.getProfilingLevel()               ---只查询Profiling级别可用此命令
    1

2)Profiling的级别

1
2
3
0 – 不开启
1 – 记录慢命令 (默认为>100ms)
2 – 记录所有命令

3)Profile的相关信息解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    ? op:操作的类型,比如:insert,query,command,remove...
    ? ns:被查询目标的命名空间,一般是数据库名和collection名的组合
    ? query:查询的具体语句,如果是insert操作,则会是insert的语句
    ? command:如果操作是一个command,则command语句记录在此
    ? keysExamined:以前是nscanned,3.2版本之后改为keysExamined,表示执行此次操作所扫描的索引键记录数
    ? updateobj:如果操作是一个update,则update语句记录在此
    ? ndeleted:此次操作删除的文档数
    ? ninserted: 此次操作插入的文档数
    ? nModified:此次操作的update的文档数
    ? writeConflicts:如果一个update语句正在操作一个文档,而另一个update同时进行操作此文档,从而造成的冲突数量
    ? locks:此次操作产生锁的相关信息
    ? nreturned:此次操作返回的文档数
    ? responseLength:操作结果集的大小,
moved:表明本次update是否移动了硬盘上的数据,如果新记录比原记录短,通常不会移动当前记录,如果新记录比原记录长,那么可能会移动记录到其它位置,这时候会导致相关索引的更新.磁盘操作更多,加上索引更新,会使得这样的操作比较慢.(不过这个选在仅针对引擎是MMAPv1)

4)查询Profile记录语句

  1. 查询执行时间大于200ms的Profile记录
1
> db.system.profile.find( { millis : { $gt : 200 } } )
  1. 查询执行时间大于200ms的Profile记录:并根据millis排序(-1为降序,1为排序)
1
> db.system.profile.find( { millis : { $gt : 200 } } ).sort({"millis":-1})
  1. 查看最近的10条记录
1
>db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
  1. 查看关于某个collection的相关慢查询操作
1
>db.system.profile.find({ns:'mydb.table1'}).pretty()

5)清除Profile慢日志并查看配置

1
2
3
db.setProfilingLevel(0);
db.system.profile.drop();
db.setProfilingLevel(1);