DevOps / Jenkins

实现自动化SQL审查:Jenkins与Soar的集成

浅时光博客 · 5月12日 · 2020年 · 18.8w 次已读

一、Soar介绍

Soar(SQL Optimizer and Rewriter)是由小米公司开源的一款用于优化和改写 SQL 查询的工具。它旨在通过智能检查 SQL 查询,提供优化建议和自动改写,从而提升数据库查询性能和效率。Soar 主要用于帮助开发人员和数据库管理员优化他们的 SQL 查询,以便更好地利用数据库资源,减少查询时间,并提升系统性能。

Soar 是一个有助于数据库性能优化的强大工具,可以帮助用户发现并解决 SQL 查询中的问题,提高数据库的查询性能和效率。它是一个开源项目,可以根据自己的需要进行定制和扩展,适用于各种数据库环境和应用场景。

项目地址:https://github.com/XiaoMi/soar

二、功能特点

  1. 智能分析和优化: Soar 通过深入分析 SQL 查询,利用内置的规则和优化策略,识别出可能的性能问题并提供优化建议。这些建议可以帮助用户改进查询的执行计划,提高查询性能。
  2. SQL 改写: Soar 能够自动改写 SQL 查询,将其转化为更优化的形式。它可以对查询进行改写,以利用索引、减少不必要的数据扫描和连接,从而减少查询的执行时间。
  3. 查询质量检查: Soar 可以检查 SQL 查询的质量,包括潜在的漏洞、性能问题、未优化的查询等。它可以识别出可能导致性能下文章来源(Source):浅时光博客降的因素,让用户能够及时发现并解决问题。
  4. 规则定制和扩展: Soar 允许用户根据实际需求定制和扩展优化规则。用户可以根据自己的数据库和业务场景,编写自定义的规则,以适应不同的查询优化需求。
  5. 多种数据库支持: Soar 支持多种主流的关系型数据库,包括 MySQL、MariaDB、TiDB 等。这使得用户可以在不同数据库系统上应用 Soar 来进行 SQL 查询的优化。
  6. 命令行和图形界面: Soar 提供了命令行工具和图形界面,让用户可以根据自己的喜好选择不同的方式使用工具。

三、安装部署

  • Soar的安装很简单,只需要将项目下载下来后,执行soar命令即可使用
[root@localhost ~]# wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64 -O soar

#或者下载到本机PC再上传至服务器
[root@localhost ~]# mv soar.linux-amd64 soar
[root@localhost ~]# chmod +x soar
[root@localhost ~]# mv soar /usr/local/bin/
[root@localhost ~]# soar --version
Version: 2019-01-21 16:54:09 +0800 0.11.0-16-gc12ae96
Branch: master
Compile: 2019-01-21 16:55:46 +0800 by go version go1.10.7 linux/amd64
GitDirty: 0

四、使用测试

[root@localhost ~]# soar -query "select *  from tb;"
# Query: 09D1F5952A76399F

★ ★ ★ ☆ ☆ 75分

```sql

SELECT  
  * 
FROM  
  tb
```

## 最外层 SELECT 未指定 WHERE 条件

* **Item:**  CLA.001

* **Severity:**  L4

* **Content:**  SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。

## 不建议使用 SELECT * 类型查询

* **Item:**  COL.001

* **Severity:**  L1

* **Content:**  当表结构变更时,使用 \* 通配符选择所有列将导致查询的含义和行为会发生更改,可能导致查询返回更多的数据。

五、结合Jenkins

1、安装插件

2、配置邮件

  • Linux系统上安装Email服务
[root@localhost ~]# yum -y install sendmail
[root@localhost ~]# yum install -y mailx
[root@localhost ~]#  yum -y install jwhois

3、编写代码

//解决HTML显示问题
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
pipeline {
   agent { node {label "master"}}
   stages {
      stage("CreateSQLFile"){
      	steps{
      		script{
      			sh "echo '${SQL};' > migrate.sql && cat migrate.sql"
      		}
      	}
      }

      stage("SoarSQL"){
      	steps{
      		script{
      			sh """
                              #一般jenkins是普通用户运行的,所以把soar命令拷贝到当前jenkins运行用户的家目录下,防止权限问题导致命令无法执行
      			    /home/deploy/soar -report-type html -query  v${ProjectName}-migrate.sql   > soarsql.html
                    cat soarsql.html

                    """
                publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: '', reportFiles: ' soarsql.html', reportName: 'SQLreport', reportTitles: ''])
      		
                Email("SQL审核完成 <a href='http://192.168.66.101:8080/ /view/${JOB_NAME}/job/${JOB_NAME}/SQLreport/'>审核报告</a>","${EmailUser}")  #Job传入email地址
      		}
      	}
      }
   }
}



//定义邮件内容
def Email(status,emailUser){
    emailext body: """
            <!DOCTYPE html> 
            <html> 
            <head> 
            <meta charset="UTF-8"> 
            </head> 
            <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> 
                <img src="http://192.168.66.112/jenkins.jpg"> //logo地址
                <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">   
                    <tr> 
                        <td><br /> 
                            <b><font color="#0B610B">构建信息</font></b> 
                        </td> 
                    </tr> 
                    <tr> 
                        <td> 
                            <ul> 
                                <li>项目名称:${JOB_NAME}</li>         
                                <li>构建编号:${BUILD_ID}</li> 
                                <li>构建信息: ${status} </li>                         
                                <li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                                <li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li> 
                            </ul> 
                        </td> 
                    </tr> 
                    <tr>  
                </table> 
            </body> 
            </html>  """,
            subject: "Jenkins-${JOB_NAME}项目构建信息 ",
            to: emailUser    
}
  • 如果执行构建出现以下错误,这是因为Jenkins不允许使用外部的css等样式,需要允许后才可以执行
  • 处理方案就是点击下图部分,然后跳转进去选择允许运行脚本

4、创建任务

  • 现在我们创建一个流水线任务,配置如下

5、执行构建

5.1:查看分析结果

5.2:查看邮箱消息


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/2401.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

6 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. 昨梦西湖2021-10-26 · 17:17

    能显示中文了,不过Jenkins和soar是安装在一台linux机器上的吗,Jenkins和soar我不知道咋结合

    • 浅时光博客2021-10-26 · 17:41

      可以同一台也可以不是同一台,反正就是Jenkins去调用soar二进制执行文件的

      • 昨梦西湖2021-10-26 · 18:07

        大佬,具体咋调用呀,你教程里有写吗?

        • 浅时光博客2021-10-26 · 18:08

          有写呀,那个pipeline代码里 调用sh模块执行

  2. 昨梦西湖2021-10-26 · 15:24

    大佬,soar使用的时候无法显示汉字是啥原因?

    • 浅时光博客2021-10-26 · 15:45

      啥意思,安装中文插件