mongodb系列~mongodb慢语句(2)

本文分享了在MongoDB 3.0.6分片集群环境下,如何通过慢日志定位并解决慢查询问题的过程。从查找慢日志开始,到SQL定位、索引检查、在线添加索引直至后台执行,详细记录了整个排障流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一简介:今天遇到一个慢日志的排查和解决过程

二 版本: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值