MongoDB慢日志

​ 熟悉 Mysql 的人应该知道,Mysql 是有个慢查询日志的,它可以帮助我们进行优化我们的 sql,并提高我们系统的稳定性和流畅性。那么 MongoDB 中是否也有类似的功能吗? 是有的,它就是 Database Profiler(下面我直接称为慢查询了),我们可以通过设置 Database Profiler 来记录一些超过阈值的查询。然后我们后期可以通过这些记录进行优化查询。

​ MongoDB 的 慢查询记录储存在 system.profile 里,默认情况下是关闭的,我们可以在数据库级别上或者是节点级别上配置。

状态码及相关描述:

  • 0:表示关闭慢查询,默认情况下

  • 1:表示超过阈值的查询收集

  • 2:为所有数据库开启慢查询记录,收集所有的数据

1. 启动方式

  1. 通过MongoShell启动

    #  为所有数据库开启慢查询记录
    db.setProfilingLevel(2) #  指定数据库,并指定阈值慢查询 ,超过20毫秒的查询被记录
    use testdb.setProfilingLevel(1, { slowms: 20 }) #  随机采集慢查询的百分比值,sampleRate 值默认为1,表示都采集,0.42 表示采集42%的内容。
    db.setProfilingLevel(1, { sampleRate: 0.42 }) # 查询慢查询级别和其它信息
    db.getProfilingStatus() # 仅返回慢查询级别
    db.getProfilingLevel() # 禁用慢查询
    db.setProfilingLevel(0)
  2. 通过配置文件启动

    在配置文件 mongod.conf 添加以下参数, profile参数是设置开启等级,slowms是设置阈值

    ​ profile = 1

    ​ slowms = 300

    在配置文件中配置

    operationProfiling:  
    mode:<string> # 默认为 off,可选值 off、slowOp(对应上面的等级 1)、all(对应上面的等级 2)   
    slowOpThresholdMs:<int> # 阈值,默认值为100,单位毫秒  
    slowOpSampleRate:<double> # 随机采集慢查询的百分比值,sampleRate 值默认为1,表示都采集,0.42 表示采集42%的内容

2. 慢查询常用命令

# 查询最近的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() # 查询 低于 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()

3. 慢日志解析

{
"op" : "query",  # 操作类型,值可为command、count、distinct、geoNear、getMore、group、insert、mapReduce、query、remove、update
"ns" : "test.report", # 操作的数据库和集合
"command" : {    # 命令
"find" : "report",  # 操作的集合
"filter" : { "a" : { "$lte" : 500 } }, # 查询条件
"lsid" : {   
"id" : UUID("5ccd5b81-b023-41f3-8959-bf99ed696ce9") # 用户的会话id
},
"$db" : "test"  # 操作的数据库
},
"cursorid" : 33629063128,  # query和getmore 的游标id
"keysExamined" : 101, # MongoDB为执行操作而扫描的索引键的数量
"docsExamined" : 101, # MongoDB为了执行操作而扫描的集合中的文档数。
"numYield" : 2, # 让步次数,操作时让其他的操作完成的次数。
"nreturned" : 101, # 操作返回的文档数
"queryHash" : "811451DD", # 查询的hash值
"planCacheKey" : "759981BA",
"locks" : {  # 操作期间的锁和所的类型
"Global" : {  #表示全局锁定
"acquireCount" : { #锁定的次数
"r" : NumberLong(3)  # 表示共享锁
}
},
"Database" : {  # 数据库锁
"acquireCount" : { "r" : NumberLong(1) },
"acquireWaitCount" : { "r" : NumberLong(1) },
"timeAcquiringMicros" : { "r" : NumberLong(69130694) }
},
"Collection" : {  # 集合锁
"acquireCount" : { "r" : NumberLong(1) }
}
},
"storage" : { # 储存
"data" : {
"bytesRead" : NumberLong(14736), #操作 从磁盘放到缓存的数据的字节数
"timeReadingMicros" : NumberLong(17) # 操作 花费在磁盘读取的时间,以微妙为单位
}
},
"responseLength" : 1305014, # 操作返回结果的文档长度,单位为字节
"protocol" : "op_msg", # 消息的协议
"millis" : 69132, # 从 MongoDB 操作开始到结束耗费的时间
"planSummary" : "IXSCAN { a: 1, _id: -1 }",  # 摘要
"execStats" : {  # 操作执行过程中的详细信息
"stage" : "FETCH", # 操作形式 ,COLLSCAN 用于集合扫描,IXSCAN 用于扫描索引键,FETCH 用于检索文档
"nReturned" : 101, # 返回的文档数量
"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", #客户端应用标识符
"allUsers" : [
{
"user" : "someuser", # 用户
"db" : "admin"  # 验证的数据库
}
],
"user" : "someuser@admin"  # 经过验证的用户
}

MongoDB慢日志的更多相关文章

  1. 使用 MongoDB 存储日志数据

    使用 MongoDB 存储日志数据     线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题 ...

  2. [转] 【Monogdb】MongoDB的日志系统

    记得前几天有个小伙伴要查看mongodb的日志,从而排查问题,可能总找不到日志放在何处,今天就系统说一下mongodb的日志系统.mongodb中主要有四种日志.分别是系统日志.Journal日志.o ...

  3. Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录

    此为在网络上找来的,觉得很好! 实现目的: 对Mongodb数据库日志按天保存,并且只保留最近7天的日志记录. 具体操作: 使用Mongodb数据库自带的命令来切割日志 ps -def | grep ...

  4. MongoDB 存储日志数据

    MongoDB 存储日志数据 https://www.cnblogs.com/nongchaoer/archive/2017/01/11/6274242.html 线上运行的服务会产生大量的运行及访问 ...

  5. 关于mongodb的日志

    mongodb的日志与profile相似,在启动mongod时 可以用verbose这个参数配置他的日志详细程度,分为一个v到5个v,其中v越多,详细度越高   mogod.conf port = d ...

  6. MongoDB log4j 日志整合

    在分布式系统当中,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数据库系统中,而再由日志分析系统去管理.而这个储存日志 ...

  7. MongoDB应用案例:使用 MongoDB 存储日志数据

    线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖 ...

  8. Mongodb 存储日志信息

    线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖 ...

  9. 基于.net core webapi和mongodb的日志系统

    开发环境vs2017,.NET Core2.1, 数据写入到mongodb.思路就是1.提供接口写入日志,2.基于接口封装类库.3.引入类库使用 源码在最后 为什么要写它 很多开源项目像nlog.lo ...

  10. MongoDB的日志系统

    mongodb中主要有四种日志.分别是系统日志.Journal日志.oplog主从日志.慢查询日志等.这些 日志记录着Mongodb数据库不同方便的踪迹.下面分别介绍这四种日志: 1.系统日志 系统日 ...

随机推荐

  1. Electron-ChatGPT桌面端ChatGPT实例|electron25+vue3聊天AI模板EXE

    基于electron25+vite4+vue3仿制chatgpt客户端聊天模板ElectronChatGPT. electron-chatgpt 使用最新桌面端技术Electron25.x结合Vite ...

  2. xpoc漏洞使用与编写 浅尝

    下载地址 https://github.com/chaitin/xpoc/releases 目前最新版本是 0.0.4 可能是我还是不太习惯yaml这种结构的,感觉就很反人类,所以我以前一般都还是po ...

  3. 带你彻底掌握Bean的生命周期

    摘要:我们将深入研究Spring Framework的核心部分--Spring Bean的生命周期. 本文分享自华为云社区<Spring高手之路5--彻底掌握Bean的生命周期>,作者: ...

  4. 区块链应用:椭圆曲线数字签名算法ECDSA

    1 椭圆曲线密码学 椭圆曲线密码学(Elliptic Curve Cryptography,缩写ECC),是基于椭圆曲线数学理论实现的一种非对称加密算法.椭圆曲线在密码学中的使用是在1985年有Nea ...

  5. 图扑 AR 技术应用与管理:施工建造、机柜扫描、办公室导航解决方案

    随着科技的不断革新和创新,越来越多的行业开始迎来数字化时代的变革.建筑行业作为人类历史上最重要的产业之一,在数字化转型方面同样也在不断推进.图扑软件结合 AR 技术的应用,为建筑行业带来了更加便捷高效 ...

  6. “easyExcel”导入的代码实现

    使用easyExcel在导入数据事有很好的使用性,方便操作. 添加依赖: <dependency> <groupId>com.alibaba</groupId> & ...

  7. 春节无法线下社交聚会,来线上“一起X”共享体验

    引语: 共享体验或许是全真互联网时代最显著的标志. 被疫情深刻改变的一年里,人们的社交关系和社交活动正在发生巨大的改变. 一方面,从线下转线上,我们能通过互联网连接更多的人,参与各种形式的社交活动,将 ...

  8. T-star高校挑战赛部分wp

    web-1签到 checkin还是很基础的 网站上传存在js检测,禁用js即可上传 写PHP一句话木马上传,http://588f25a5.yunyansec.com/upload/test.php连 ...

  9. 【原创】xenomai UDD介绍与UDD用户态驱动示例

    目录 xenomai UDD与用户态驱动示例 一.UDD介绍 二.UDD原理及框架 1. 内存映射 2. 中断处理 UDD与UIO的区别 3. linux UIO与xenomai UDD框架对比 3. ...

  10. linux 查看进程使用的内存大小

    你可以使用 ps 命令结合 grep 命令来查看进程使用的内存大小.以下是示例代码: ps aux | grep <进程名> 这个命令会列出所有匹配 <进程名> 的进程,并显示 ...