背景

有个调研任务:SQL自动审核工具,一开始给的方向呢是 Inception + SQLAdvisor 来实现,结果查了文档,实际安装使用时才发现虽然可以验证 sql 语句规范之类的,但是还需要 python 二次开发才可以使用,并不符合现下的需求。我就找到了现在这个:Anemometer + pt-query-digest 其实就是使用 pt-query-digest 搜集慢查询日志,然后使用 Anemometer 将搜集到的数据以web 形式展现出来,方便查询分析。那怎么检测sql语句规不规范呢?既然这个sql查询非常慢,那就肯定被查询显示出来了,自然而然的就会优化这条sql语句,虽然比不上那种设定好规则,自动将sql不规范之处检测出来,但更精细一些。

环境

首先准备好LNMP环境。L本身这个服务器就是刚装的 centos7 跳过了,前面两篇文章也说了



但是不能每次都要一个一个来安装,太麻烦了,走一波捷径,一键安装LNMP环境:

  1. 下载安装包 wget https://github.com/maicong/LNMP/archive/master.zip
  2. 解压安装包 unzip master.zip
  3. 进入安装包目录 cd LNMP-master
  4. 执行安装命令 bash lnmp.sh

install
我选择的是 PHP7 + MySQL5.6 + Nginx1.8,然后坐等自动安装。
lnmp
这样就安装好了,访问你的 ip地址就可以啦!附一键安装 LNMP 环境脚本 Github 地址:传送门

安装percona-toolkit

既然环境搞定,然后就是安装 percona-toolkit,因为我们要用到其中的日志分析工具 pt-query-digest

yum install -y perl-DBI 
yum install -y perl-DBD-MySQL
wget https://www.percona.com/downloads/percona-toolkit/2.2.16/tarball/percona-toolkit-2.2.16.tar.gz
tar xzvf percona-toolkit-2.2.16.tar.gz
cd percona-toolkit-2.2.16
perl Makefile.PL
make
make install

先安装MySQL的组件,以免后面报错,还要安装 yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMakeryum -y install perl-Digest-MD5,不然 perl Makefile.PL 会报错。

安装Anemometer

Anemometer 的 Github地址:https://github.com/box/Anemometer
下载:wget https://github.com/box/Anemometer/archive/master.zip
解压:unzip master.zip
重命名:mv Anemometer-master anemometer 并移动到/home/wwwroot/index/anemometer下(nginx默认站点路径,因为我是一键安装所以是这个路径,视个人而定)
进到 anemometer文件夹下,导入数据 mysql -uroot -p < install.sqlmysql -uroot -p < mysql56-install.sql 这个时候你的数据库就多了一个库四张表:
show query log

别急着退出 MySQL 命令,因为我是一键装的环境,MySQL 数据库密码是随机的字符串,先修改密码: set password for root@localhost = password('root'); 接着还有给予主机访问数据的权限可以远程连接 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION
然后看下数据库慢查询的时间,一般默认为10s show variables like "%long%";
因为这边暂时没数据,就设的很小 set global long_query_time=0.001;
然后看下慢查询开启了没有 show variables like "%slow%";
启用慢查询 set global slow_query_log='ON';
再查看一波日志是否开启了 show variables like "%log%";
开启日志 set global general_log='ON';
到此可以退出 MySQL 命令模式了。MySQL 开启:mysql -u root -p

准备用远程连接,结果没连接上,端口开了也没被占用,MySQL 服务也开启了,那就很大可能是服务器防火墙咯,我这里比较简单粗暴,直接关闭防火墙,并且禁止开机自启动,不推荐大家使用哟!因为我是 Centos7,它默认使用的是 firewall 作为防火墙,所以这里我使用的命令是:

#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service

转回正题接着在 anemometer 文件夹下进入 conf, cp sample.config.inc.php config.inc.php,修改 config.inc.php
ip
root

将账号密码换为数据库的账号密码,并且将数据库地址换上即可。这个时候就可以查看页面啦(只不过没数据),访问你的ip 地址/anemometer,例如我的 http://192.168.100.128/anemometer/

最最最后一步:将慢查询日志通过pt-query-digest分析后存入数据库中。

pt-QUERY-digest --user=root --password=root --review  
h=192.168.100.128,D=slow_query_log,t=global_query_review --history 
h=192.168.100.128,D=slow_query_log,t=global_query_review_history --no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\"" /home/userdata/localhost-slow.log

可以做一个定是脚本,运行这段,它会定时同步满日志到数据库中。然后就有数据啦:
result

最后附一张说明图:
explain

最后修改:2020 年 02 月 05 日 12 : 52 PM
如果觉得我的文章对你有用,请随意赞赏