mysql processlist聚合分析

昨晚db告警,从慢日志和异常日志行为分析,表现都不太明显(并不像以往api请求变更历史那样有明显的IP和action或是用户信息,比较分散),虽然log初步分析是api流量有点大,但是最后都由于自己不够坚定而放弃了怀疑,说白了,还是自己技术不够到位,事后分析了下,慢日志和异常行为日志这两者如果不明显,但是db进程数(出现很多sleep进程)一直告警,是否可以通过processlist host出现的次数,来判断sql来源呢?如果host指向api,是不是就可以坐实了,那如何统计processlist host出现的次数?

show full processlist;并不支持类似like的过滤。于是想通过这个命令筛选得到某些服务器IP的连接不可取。但并不是没有好的办法,因为show full processlist;命令本身就是查询表PROCESSLIST里的内容,表PROCESSLIST在数据库information_schema中,我们在执行show processlist时实际在mysql中就是执行查询information_schema数据库中的processlist表查询。这就好办了,因为字段HOST中的值多是ip:port,这种IP加端口结构(当然我上面有的是localhost,这个不用考虑,大网站都会是多个WEB连接MYSQL,基本都是IP端口),所以上面使用字符串以逗号分隔,从而截取IP地址出来。所以如果想根据HOST中的连接IP地址来进行分组统计,可以使用SQL:

select server,count(server) as servernum from (select substring_index(host,':' ,1) as server from processlist ) as rsa group by server order by servernum desc;

substring_index(字段名, ‘:’, 1)的作用:截取第1个 ‘:’ 之前的所有字符。非常有用。

其实除此之外,还可以通过其他手段坐实问题
1.API容器当中php slow log (/xxxx/php/slow.log)
2.API容器当中php error.log(/xxxx/php/error.log)