收到线上数据库cpu告警信息,查看发现数据库监控发现Mongodb primary节点 cpu使用率接近90%。用到命令db.currentOp()和db.killOp()
1.查看日志
日志分析:全表扫描,使用索引过滤文档数0,全表扫描1146174个文档,执行时间720ms,过滤日志发现次数3000多次。 planSummary: COLLSCAN keysExamined:0 docsExamined:1146174 cursorExhausted:1 numYields:8954 nreturned:1 reslen:1762 locks:{ Global: { acquireCount: { r: 17910 } }, Database: { acquireCount: { r: 8955 } }, Collection: { acquireCount: { r: 8955 } } } protocol:op_msg 720ms
2.打印数据当前操作
mongos> db.currentOp() //返回数据库当前所有操作
定位到慢查询操作的opid
mongos> db.killOp("cmgo-kj6dtmrr_0:1540756629") //将慢查询kill掉,
3.创建索引
Mongodb 4.2版本之前创建索引需要 添加background指定为true,如果索引v2版本指定"background" : 1,默认为false前台索引创建会阻塞数据库上的所有其他操作,我们使用的版本为3.6。
mongos> db.app_trace_log.createIndex({"traceId":1},{"background":1} ) //后台创建索引
mongos> db.app_trace_log.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "app_log.app_trace_log"
},
{
"v" : 2,
"key" : {
"traceId" : 1
},
"name" : "traceId_1", //默认索引名:索引字段_1
"ns" : "app_log.app_trace_log",
"background" : 1
}
]
注意:这两个命令是不一样的
db.app_trace_log.createIndex({"traceId":1},{"background":1} ) //后台创建单建索引,mongodb默认也创建了"traceId":-1倒序索引,不需要在创建倒序索引了
db.app_trace_log.createIndex({"traceId":1,"background":1} ) //创建复合索引
查看监控,已恢复正常 和业务进行沟通新上线了功能,集合没有添加索引,访问量上来导致全表扫描。
db.currentOp({"$ownOps" :true}) //查看当前用户的操作信息