mongodb系列~ mongodb慢语句(3)

简介: 关于mongodb慢日志是如何收集

一 mongodb慢日志的开启

1 直接设置参数,不重启服务:db.setProfilingLevel(1)

2 添加启动参数,重启服务:添加profile=1

二 mongodb慢日志参数说明

查看 profiing当前级别 :db.getProfilingLevel()

0 默认不开启记录

1 开启记录慢日志(默认>=100ms)

2 记录所有命令

三 如何调整慢日志记录参数

1 直接设置参数  db.setProfilingLevel( level , slowms )

2 启动项配置文件添加参数 slowms=

我们线上设置的是12000 也即是12S ,这样收集的sql大大减少

四 编写收集脚本,进行远程收集

1 创建相应的表

CREATE TABLE `mongo_slow_log` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`ip` varchar(20) DEFAULT NULL,

`delay` varchar(10) DEFAULT NULL,
 `sqltime` datetime DEFAULT NULL,
 `sqltext` text,
 `createtime` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
  ENGINE=InnoDB AUTO_INCREMENT=22420 DEFAULT CHARSET=utf8mb4;

2 编写相应的shell脚本

function jilu(){
 IP=`/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{ print $1}'`
 result=`awk '$NF~/ms$/{print $1,$NF}' $1|sed 's/ms//g'|awk '$2 > 12000 {print $1,$2}'`
 if [ "$result" ];
 then
 echo "$result" > /home/a.txt
 cat /home/a.txt |while read line ;
 do echo $line ;
 yanshi=`echo $line|awk '{print $2}'`
 tiaojian=`echo $line|awk '{print $1}'`
 jieguo=`cat $1|grep $tiaojian`
 jieguo1=`echo $jieguo|sed "s/"\'"/"\""/g"`
 shijian=`echo $jieguo1|sed "s/"\'"/"\""/g"|awk '{print $1}'`
 shijianchuli=`echo "$shijian"|cut -d '.' -f 1|sed 's/T/ /g'`
 echo -e "insert into mongo_slow_log(ip,delay,sqltime,sqltext) values('$IP','$yanshi','$shijianchuli','$jieguo1')"|/usr/local/mysql/bin/mysql -u -p -h --default-character-set=utf8 l
 done
 else
 echo -e "insert into mongo_slow_log(ip,delay,sqltext) values('$IP','empty','empty')"|/usr/local/mysql/bin/mysql -u -p --default-character-set=utf8 
 }
 riqi=`date -d yesterday +%F`
 file=`find /data/mongo/shard1/ -name "shard1.log.$riqi*" -exec iconv -f CP850 -t utf-8 {} > /home/ops/result.txt \;`
 jilu "/home/ops/result.txt"

脚本核心思想:mongo会将慢日志记录在shard文件中,当天进行脚本切割并过滤出指定sql即可,各位可自行修改(PS:本人脚本很烂,哈哈)

五 进行分析

用explain进行分析(explain的详细本文不会详细讲解,以后会有专门说明)

六 收集目的

不论是何种数据库,对慢日志语句的收集都非常重要,比如研发接口相应超时,数据库本身性能消耗很高,都可以根据慢日志进行分析。

上一篇:MD5 算法


下一篇:MD5算法的原理与实现