简介: 关于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的详细本文不会详细讲解,以后会有专门说明)
六 收集目的
不论是何种数据库,对慢日志语句的收集都非常重要,比如研发接口相应超时,数据库本身性能消耗很高,都可以根据慢日志进行分析。