背景
有个调研任务:SQL自动审核工具,一开始给的方向呢是 Inception + SQLAdvisor 来实现,结果查了文档,实际安装使用时才发现虽然可以验证 sql 语句规范之类的,但是还需要 python 二次开发才可以使用,并不符合现下的需求。我就找到了现在这个:Anemometer + pt-query-digest 其实就是使用 pt-query-digest 搜集慢查询日志,然后使用 Anemometer 将搜集到的数据以web 形式展现出来,方便查询分析。那怎么检测sql语句规不规范呢?既然这个sql查询非常慢,那就肯定被查询显示出来了,自然而然的就会优化这条sql语句,虽然比不上那种设定好规则,自动将sql不规范之处检测出来,但更精细一些。
环境
首先准备好LNMP环境。L本身这个服务器就是刚装的 centos7 跳过了,前面两篇文章也说了
但是不能每次都要一个一个来安装,太麻烦了,走一波捷径,一键安装LNMP环境:
- 下载安装包
wget https://github.com/maicong/LNMP/archive/master.zip
- 解压安装包
unzip master.zip
- 进入安装包目录
cd LNMP-master
- 执行安装命令
bash lnmp.sh
我选择的是 PHP7 + MySQL5.6 + Nginx1.8,然后坐等自动安装。
这样就安装好了,访问你的 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-MakeMaker
、 yum -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.sql
、 mysql -uroot -p < mysql56-install.sql
这个时候你的数据库就多了一个库四张表:
别急着退出 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 地址/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
可以做一个定是脚本,运行这段,它会定时同步满日志到数据库中。然后就有数据啦:
最后附一张说明图: