SQL审核工具SQL Advisor简单体验

现在的很多大公司,都喜欢招丰富经验的人,从公司的角度来说,能把当前的事务性工作解决了,在这个基础上能够把你的理解和知识沉淀下来,那是极好的,说通俗一些,算是吸星大法了。

我和雪刚相识于几年前的一次技术沙龙,当时是邀请他来做的一起关于监控报警的分享,时间一晃几年就过去了。技术圈已经有了很大的变化,在SQL审核领域,开源工具SQL Advisor中也看到了雪刚的贡献。

GitHub上来看下这个项目的情况,star有2000多,还是比较高的了。在工具的更新和活跃度上,貌似有了停滞的进度。

对于SQL审核,一直以来我觉得审核的价值是性能和潜在问题,语法问题严格意义上来说不属于审核的范畴,但是让我捉急的是,我们却需要花很多的工具在权限,语法上,希望这款工具能给我一些新的视角。

要体验下这个工具,整个过程我用了差不多半个多小时就部署跑通了。

简单来说下这个过程吧。

前期是要安装一些基本的软件包。

yum install cmake libaio-devel libffi-devel glib2 glib2-devel

接下来编辑的过程有点类似源码安装MySQL。我们需要把sqlparser编译到/usr/local/sqlparser路径下。

cmake -DBUILD_CONFIG=mysql_release -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr/local/sqlparser ./

make

make install

整个过程相对很快。

然后我们到sqladvisor的目录下,编译安装sqladvisor

一个测试的目录结构如下:

/root/sqladvisor/SQLAdvisor/sqladvisor

目录下的文件是下面的样子:

[root@dev01 sqladvisor]# ll

total 60

-rw-r--r-- 1 root root 694 Jun 26 22:14 CMakeLists.txt

-rw-r--r-- 1 root root 53195 Jun 26 22:14 main.cc

-rw-r--r-- 1 root root 257 Jun 26 22:14 README

开始编译:

cmake -DCMAKE_BUILD_TYPE=debug ./

如果MySQL的配置不对,很可能在make阶段出错,这个错误根本上来说还是链接库的缺失。

[root@dev01 sqladvisor]# make

Scanning dependencies of target sqladvisor

[100%] Building CXX object CMakeFiles/sqladvisor.dir/main.cc.o

Linking CXX executable sqladvisor

/usr/bin/ld: cannot find -lperconaserverclient_r

collect2: ld returned 1 exit status

make[2]: *** [sqladvisor] Error 1

make[1]: *** [CMakeFiles/sqladvisor.dir/all] Error 2

make: *** [all] Error 2

在/usr/lib64下面找不到对应的链接库,我们可以手工配置一下即可。

如果你安装的是Percona分支的话,可以使用如下的步骤:

1. cd /usr/lib64/

2. ln -s libperconaserverclient_r.so.18 libperconaserverclient_r.so

我安装的是社区版本,版本更新一些,所以简单可以这种修改下。

[root@dev01 lib]# ll

total 1003112

-rw-r--r-- 1 root root 20051248 Nov 22 2017 libmysqlclient.a

-rwxr-xr-x 1 root root 9255841 Nov 22 2017 libmysqlclient.so

-rwxr-xr-x 1 root root 9255841 Nov 22 2017 libmysqlclient.so.20

-rwxr-xr-x 1 root root 9255841 Nov 22 2017 libmysqlclient.so.20.3.6

创建链接库:

[root@dev01 lib]# cp libmysqlclient.so.20 /usr/lib64/

ln -s libmysqlclient.so.20 libperconaserverclient_r.so

再次编译就没有问题了。

[root@dev01 sqladvisor]# make

Linking CXX executable sqladvisor

[100%] Built target sqladvisor

当然对于使用来说,为了更方便,我们可以创建个软链接。

ln -s sqladvisor /usr/bin/

基本到了这一步,就能证明我们的软件安装成功了。

[root@dev01 sqladvisor]# ./sqladvisor --help

Usage:

sqladvisor [OPTION...] sqladvisor

SQL Advisor Summary

Help Options:

-?, --help Show help options

Application Options:

-f, --defaults-file sqls file

-u, --username username

-p, --password password

-P, --port port

-h, --host host

-d, --dbname database name

-q, --sqls sqls

-v, --verbose 1:output logs 0:output nothing

从整个部署和脚本的情况来看,它是一种在线监测。

比如我们创建一个数据库testdb,然后写个简单的SQL来看看效果。

初始化数据:

mysql> use testdb

Database changed

mysql> create table t2(id int primary key,name varchar(30));

Query OK, 0 rows affected (0.08 sec)

mysql> insert into t2 values(1,'aa'),(2,'bb'),(3,'cc');

Query OK, 3 rows affected (0.09 sec)

Records: 3 Duplicates: 0 Warnings: 0

使用如下的命令后,可以看到SQL审核后的结果如下:

[root@dev01 sqladvisor]# ./sqladvisor -h 127.0.0.1 -u root -p xxxx -P 3306 -d testdb -q "select * from t2 where id=3;" -v 1

2018-06-26 22:31:15 26531 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `testdb`.`t2` where (`id` = 3)

2018-06-26 22:31:15 26531 [Note] 第2步:开始解析where中的条件:(`id` = 3)

2018-06-26 22:31:15 26531 [Note] show index from t2

2018-06-26 22:31:15 26531 [Note] 第3步:SQLAdvisor结束!错误日志:

然后我们删除主键,查看效果是否有差别。

mysql> alter table t2 drop primary key;

Query OK, 3 rows affected (0.13 sec)

Records: 3 Duplicates: 0 Warnings: 0

结果如下:

[root@dev01 sqladvisor]# ./sqladvisor -h 127.0.0.1 -u root -p xxxx -P 3306 -d testdb -q "select * from t2 where id=3;" -v 1

2018-06-26 22:32:38 26539 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `testdb`.`t2` where (`id` = 3)

2018-06-26 22:32:38 26539 [Note] 第2步:开始解析where中的条件:(`id` = 3)

2018-06-26 22:32:38 26539 [Note] show index from t2

2018-06-26 22:32:38 26539 [Note] 第3步:SQLAdvisor结束!表中没有任何索引

可见效果是预期中的。

当然也可以使用配置文件来运行。创建配置文件sql.cnf:

[root@dev01 sqladvisor]# vi sql.cnf

[sqladvisor]

username=root

password=xxxx

host=127.0.0.1

port=3306

dbname=testdb

sqls=select * from t2 where id=3;

整个SQL审核后的结果如下:

[root@dev01 sqladvisor]# ./sqladvisor -f sql.cnf -v 1

2018-06-26 22:33:37 26544 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `testdb`.`t2` where (`id` = 3)

2018-06-26 22:33:37 26544 [Note] 第2步:开始解析where中的条件:(`id` = 3)

2018-06-26 22:33:37 26544 [Note] show index from t2

2018-06-26 22:33:37 26544 [Note] 第3步:SQLAdvisor结束!表中没有任何索引

如果创建一个辅助索引,这个时候的检测结果有些奇怪,这个部分我后续要再琢磨下这个逻辑,看看有没有改进的空间。

mysql> alter table t2 add key idx_t2_id(id);

[root@dev01 sqladvisor]# ./sqladvisor -h 127.0.0.1 -u root -p tesatch -P 3306 -d testdb -q "select * from t2 where id=3;" -v 1

2018-06-26 23:12:36 26734 [Note] 第1步: 对SQL解析优化之后得到的SQL:select `*` AS `*` from `testdb`.`t2` where (`id` = 3)

2018-06-26 23:12:36 26734 [Note] 第2步:开始解析where中的条件:(`id` = 3)

2018-06-26 23:12:36 26734 [Note] show index from t2

2018-06-26 23:12:36 26734 [Note] 第3步:SQLAdvisor结束!表中没有任何索引

而如果使用了drop选项,这个时候就放大招了。:)

[root@dev01 sqladvisor]# ./sqladvisor -h 127.0.0.1 -u root -p tematch -P 3306 -d testdb -q "drop table t2 ;" -v 1

2018-06-26 22:39:17 26582 [Note] 第1步: 对SQL解析优化之后得到的SQL:select from dual where 1 having 1

2018-06-26 22:39:17 26582 [Note] 第2步:表t2 的SQL太逆天,没有优化建议

2018-06-26 22:39:17 26582 [Note] 第3步: SQLAdvisor结束!

对于SQL审核,源码文档中也给出了一些很细致的流程说明,还有更多的流程说明图,对于我们后续来定制和使用也是一种很不错的参考借鉴。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-06-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解)

本教程详细介绍了如何使用ssm框架实现支付宝支付功能。本文章分为两大部分,分别是「支付宝测试环境代码测试」和「将支付宝支付整合到ssm框架」,详细的代码和图文解...

2161
来自专栏乐沙弥的世界

Oracle ADDM性能诊断利器及报告解读

性能优化是一个永恒的话题,性能优化也是最具有价值,最值得花费精力深入研究的一个课题,因为资源是有限的,时间是有限的。在Oracle数据库中,随着Oracle功能...

1372
来自专栏IT派

如何用Python 编写知乎爬虫?So easy!

在爬虫系统中,待抓取 URL 队列是很重要的一部分。待抓取 URL 队列中的 URL 以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取...

1470
来自专栏禁心尽力

会优化,你真的会优化吗?其实你可能真的缺少一份理解【数据库篇】

  其实,在写这篇博客之前,我也是感觉自己会点优化,至少知道不要使用“*”号啊,给经常查询的列创建索引啊什么的,其实都不是大家想的那样简单的,其实它们背后存在很...

1976
来自专栏数据和云

SQL之美 - Oracle 子查询优化系列精讲

题记:SQL优化及SQL审核,是从源头解决性能问题的根本手段,无论是开发人员还是DBA,都应当持续深入的学习SQL开发技能,从而为解决性能问题打下根基。 本系列...

3483
来自专栏FreeBuf

经验分享:社会工程学数据库搭建TIPS

最近一直在搞社工库的搭建。网上这方面也有很多文章,但是很少涉及到细节,在此与大家分享一些个人心得。 测试环境 测试坏境:windows server 2012...

2578
来自专栏数据和云

Oracle 12.2 新特性:在线的修改数据表为分区表

众所周知,分区技术是Oracle应用最为广泛的一个选件,并且历史悠久,然而在过去的版本中,如果我们要将一个现有的数据表转换为分区表,则是相当复杂的一个过程,而在...

3705
来自专栏PPV课数据科学社区

【数据科学】R语言连接数据库

数据是关系数据库系统中存储的统一化格式。 因此,实施我们需要非常先进和复杂的SQL查询统计计算。但是R能够轻松地连接到诸如MySql, Oracle, Sql ...

3535
来自专栏杨建荣的学习笔记

通过定制orabbix监控分析潜在的Oracle问题 (r6笔记第32天)

在之前的博客中分享过 简单定制Orabbix监控项 http://blog.itpub.net/23718752/viewspace-1769773/ 定...

2704
来自专栏好好学java的技术栈

java实现沙箱测试环境支付宝支付和整合微信支付和支付宝支付到ssm(附源码)

下载地址:https://docs.open.alipay.com/270/106291/

5017

扫码关注云+社区

领取腾讯云代金券