sql自动审核工具-inception

[inception使用规范及说明文档](http://mysql-inception.github.io/inception-document/usage/)
[代码仓库](https://github.com/smile-java/inception)

inception介绍

inception是去哪网团队开发的一个集审核、执行、备份及生成回滚语句于一身的MySQL自动化运维工具,

可以集成进mysql自动化运维平台来实现sql的自动审核。
开发语言:C/C++ ,在mysql源码的基础上改造的

限制

目前只支持通过C/C++接口、Python接口对inception的访问

inception充当的角色

inception对于自动化应用程序(简称rid)来说是服务器,对于数据库server来说是客户端。当通过自动化平台提交语句(DML/DDL)后,

执行过程可以概括为(如果rid是Python程序)

  1. 开发人员提交待审核的sql到rid
  2. rid将要访问的数据库的连接串封装到sql语句块的头部,然后调用inception
  3. inception对sql进行语法和语义的检查以及按照参数文件中指定的审核项进行审核
  4. 审核通过后执行语句
  5. 通过解析binlog生成回滚语句保存到参数文件指定的备份库中

流程图如下:

inception安装

可以单独部署到一台主机上,并在此主机上创建备份库

cd /usr/local/src
git clone https://github.com/smile-java/inception
cd inception
# 调用脚本编译安装;指定新生成的文件到目录debug
sh inception_build.sh debug

编译报错信息

安装inception
    sh inception_build.sh debug
    CMake Error at cmake/bison.cmake:78 (MESSAGE):
      Bison (GNU parser generator) is required to build MySQL.Please install
       bison.

     -- Configuring incomplete, errors occurred!
See also "/data0/sql/inception/debug/CMakeFiles/CMakeOutput.log".
See also "/data0/sql/inception/debug/CMakeFiles/CMakeError.log".
make: *** No rule to make target `install‘.  Stop.

是缺少依赖包导致,解决是安装bison包,然后将debug删除重新编译安装即可

启动inception服务

/data0/sql/inception/debug/sql/Inception --defaults-file=/data0/sql/inception/debug/inc.cnf

注意: 因为Inception支持OSC执行的功能,是通过调用pt-online-schema-change工具来做的,但如果Inception后台启动(&)的话,可能会导致pt-online-schema-change在执行完成之后,长时间不返回,进而导致Inception卡死的问题,这个问题后面会解决,但现阶段请尽量不要使用后台启动的方式,或者可以使用nohup Inception启动命令 &的方式来启动。

inception参数说明

有关审核时参照的规范相关的参数:http://mysql-inception.github.io/inception-document/variables/

有关inception服务器连接的参数

  • port
  • socket=/自己目录,请自行修改/inc.socket

有关备份库的参数

  • inception_remote_backup_host //远程备份库的host
  • inception_remote_backup_port //远程备份库的port
  • inception_remote_system_user //远程备份库的一个用户
  • inception_remote_system_password //上面用户的密码

有关支持OSC相关的参数:http://mysql-inception.github.io/inception-document/osc/

使用案例

调用inception的Python模板

#!/usr/bin/python
#-\*-coding: utf-8-\*-
import MySQLdb
sql=‘/*--user=admin;--password=123123;--host=127.0.0.1;--execute=1;--port=3309;*/inception_magic_start;use test;query #语句块inception_magic_commit;‘
try:
    conn=MySQLdb.connect(host=‘127.0.0.1‘,user=‘root‘,passwd=‘‘,db=‘‘,port=123123)
    cur=conn.cursor()
    ret=cur.execute(sql)
    result=cur.fetchall()
    num_fields = len(cur.description)
    field_names = [i[0] for i in cur.description]
    print field_names
    for row in result:
        print row[0], "|",row[1],"|",row[2],"|",row[3],"|",row[4],"|",
        row[5],"|",row[6],"|",row[7],"|",row[8],"|",row[9],"|",row[10]
    cur.close()
    conn.close()
except MySQLdb.Error,e:
     print "Mysql Error %d: %s" % (e.args[0], e.args[1])

DDL操作

如果要调用OSC执行,需要开启参数inception_osc_bin_dir,次参数是会话级别的,每次在提交DDL时可以选择是否通过OSC执行

#登录到inception
mysql -uroot -h127.0.0.1 -p123123
# 使用OSC执行ddl
inception set session inception_osc_bin_dir=‘/usr/local/bin‘

query为:create table inctest(id int);

执行结果输出

[‘ID‘, ‘stage‘, ‘errlevel‘, ‘stagestatus‘, ‘errormessage‘, ‘SQL‘, ‘Affected_rows‘, ‘sequence‘, ‘backup_dbname‘, ‘execute_time‘, ‘sqlsha1‘]
1 | CHECKED | 0 | Audit completed | None | use test | 0 | ‘0_0_0‘ | None | 0 |
2 | CHECKED | 1 | Audit completed | Set engine to innodb for table ‘inctest‘.
Set charset to one of ‘utf8mb4,utf8‘ for table ‘inctest‘.
Set comments for table ‘inctest‘.
Column ‘id‘ in table ‘inctest‘ have no comments.
Column ‘id‘ in table ‘inctest‘ is not allowed to been nullable.
Set Default value for column ‘id‘ in table ‘inctest‘
Set a primary key for table ‘inctest‘. | create table inctest(id int) | 0 | ‘0_0_1‘ | 127_0_0_1_3309_test | 0 | 
errormessage列显示不符合规范的地方,检查的具体项有
  • 表必须要有主键,主键为自增,且自增值为1,初始自增值不能大于1
  • 表必须有comment、存储引擎必须执行为innodb、表字符集必须是inception参数中配置的其中一个
  • 新增的列必须为非空且指定默认值

按规范更改query为:create table inctest(id int unsigned NOT NULL AUTO_INCREMENT comment "id",primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment="test1";

输出为

[‘ID‘, ‘stage‘, ‘errlevel‘, ‘stagestatus‘, ‘errormessage‘, ‘SQL‘, ‘Affected_rows‘, ‘sequence‘, ‘backup_dbname‘, ‘execute_time‘, ‘sqlsha1‘]
1 | RERUN | 0 | Execute Successfully | None | use test | 0 | ‘1502183472_6520_0‘ | None | 0.000 |
2 | EXECUTED | 0 | Execute Successfully
Backup successfully | None | create table inctest(id int unsigned NOT NULL AUTO_INCREMENT comment "id",primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment="test1" | 0 | ‘1502183472_6520_1‘ | 127_0_0_1_3309_test | 0.110 | 

如果sqlsha1列输出非0,则说明使用到了OSC

问题:execute_time列对应的无值

在备份实例中会生成以mysql服务器IP、端口、库名命名的库,此处为127_0_0_1_3309_test

09:19:23[127_0_0_1_3309_test](;)> show tables;
+------------------------------------+
| Tables_in_127_0_0_1_3309_test      |
+------------------------------------+
| $_$inception_backup_information$_$ |
| inctest                            |
+------------------------------------+
3 rows in set (0.00 sec)

09:19:26[127_0_0_1_3309_test](;)> select * from $_$inception_backup_information$_$;
+-------------------+-------------------+------------------+------------------+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------+-----------+--------+-----------+------+---------------------+-------------+
| opid_time         | start_binlog_file | start_binlog_pos | end_binlog_file  | end_binlog_pos | sql_statement                                                                                                                                 | host      | dbname | tablename | port | time                | type        |
+-------------------+-------------------+------------------+------------------+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------+-----------+--------+-----------+------+---------------------+-------------+
| 1502183472_6520_1 |                   |                0 |                  |              0 | create table inctest(id int unsigned NOT NULL AUTO_INCREMENT comment "id",primary key(id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment="test1" | 127.0.0.1 | test   | inctest   | 3309 | 2017-08-08 17:11:12 | CREATETABLE |
+-------------------+-------------------+------------------+------------------+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------+-----------+--------+-----------+------+---------------------+-------------+
8 rows in set (0.00 sec)

09:19:59[127_0_0_1_3309_test](;)> select * from inctest;
+----+------------------------------+-------------------+
| id | rollback_statement           | opid_time         |
+----+------------------------------+-------------------+
|  2 | DROP TABLE `test`.`inctest`; | 1502183472_6520_1 |
+----+------------------------------+-------------------+
2 rows in set (0.00 sec)

表$_$inception_backup_information$_$记录的是inception的操作日志

回滚sql存储在和原操作表同名的表中,opid_time是执行语句的唯一序列号,如果知道执行sql的序列号,想要获得对应的回滚sql,可以执行

select rollback_statement from 127_0_0_1_3309_test.inctest where opid_time =‘1502183472_6520_1’;
时间: 2025-01-19 05:54:55

sql自动审核工具-inception的相关文章

SQL自动审核

一.工具概述 SQL自动审核-自助上线平台,可以让开发自上线,开发提交SQL后就会自动返回优化建议,无需DBA的再次审核,从而提升上线效率,有利于建立数据库开发规范,让DBA从日常繁琐的工作中解放出来. SQL自动审核主要完成两方面目的: 1.避免性能太差的SQL进入生产系统,导致整体性能降低. 2.检查开发设计的索引是否合理,是否需要添加索引. 思路其实很简单: 1.获取开发提交的SQL. 2.对要执行的SQL做分析,触碰事先定义好的规则来判断这个SQL是否可以自动审核通过,未通过审核的需要人

SQL自动审核-给出优化建议

sql_review 为方便dba和开发审核sql,特增加了规则,只需在网页里输入sql语句,会自动给出优化建议.参考的percona在线sql审核思路实现. php环境搭建:yum install httpd php 演示地址:http://106.75.10.36/ 使用说明: 1.我只对select和create加了规则,update/delete/alter属于危险语句,仍旧需要人工审核. 2.语句之间要有空格,例where id = 100,没有空格会影响判断的准确性. GitHub源

bboss自动代码生成工具使用指南

本文介绍bboss自动代码生成工具使用方法 工具在线浏览效果: http://gencode.bbossgroups.com 在介绍之前首先了解一下bboss自动代码生成工具能帮助我们做哪些事情. 通过自动代码生成框架,根据模板可以自动生成数据库表的增.删.改.分页查询.列表查询.国际化功能对应的java.jsp程序和配置文件,包括: 1.mvc控制器 2.业务组件 3.PO实体类 4.jsp文件 可以定制不同风格的界面模板,目前提供了一套bboss平台的基础ui风格和一套bboss普通ui风格

推荐一款Netwrix的免费SQL sever 变更通知工具

SQLsever 变更通知工具 Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理.Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序. 因为数据库是用来存储有价值的资产的,所以它一般都被隐藏在防火墙之后.但是,即使周围环境再安全也不足以起到保护作用.您仍然需要持续监控SQL Server的配置来确保及时发现SQL S

SQL业务审核与优化

审核   什么是业务审核 类似与code review 评审业务Schema和SQL设计 偏重关注性能 是业务优化的主要入口之一 审核提前发现问题,进行优化 上线后通过监控或巡检发现问题,进行优化 Schema设计审核 表和字段命名是否合规 字段类型,长度设计是否适当 表关联关系是否合理 主键,更新时间保留字段等是否符合要求 约束,默认值等配置是否恰当 了解业务,表数据量,增长模式 数据访问模式,均衡度 根据业务需求,表是否需要分区,是否有数据什么周期 SQL语句审核 SQL语句的执行频率 表上

Node.js 优雅地自动审核团队的代码

在团队开发中,无论是写前端(js,css,html) ,还是后端 ,我们需要解决一个问题:如何统一团队代码风格. 这篇文章主要是使用pre-git , eslint , js-beautify 实现代码风格控制. 下面分别介绍这三个工具和使用方式: pre-git该工具能实现git hook的功能,在git的流程中插入一些自定义行为,例如commit之前执行代码检测,如果不通过则报错. eslint代码格式审核工具,可以随意组合配置各种风格,用于组成团队的代码统一规范. js-beautiful

SQL Server 审核(Audit)介绍

SQL Server 审核(Audit)-- 介绍 MSDN请参见: http://msdn.microsoft.com/zh-cn/library/cc280386%28v=sql.120%29.aspx 认识审核 SQL Server审核是从SQL Server 2008开始引入的一套全新的审核系统."审核"SQL Server 数据库引擎实例或单独的数据库涉及到跟踪和记录数据库引擎中发生的事件. 通过 SQL Server 审核,您可以创建服务器审核,其中可以包含针对服务器级别事

iBatis 代码自动生成工具 iBator 及 Example 使用

iBator的下载和安装 官方下载地址:http://people.apache.org/builds/ibatis/ibator/ 安装:见<Eclipse 插件安装> 安装完成后,“File” —> "New" —> "Other..." iBatis 代码自动生成工具 iBator - 低调的华丽 - 辉色空间 选择项目名 —> "New" —> "Other..." —> “N

SQL自动调优

SQL自动调优,是oracle 自带的调优工具,可以提出一些解决方案. 本次我主要介绍下面这些自动SQL调优工具: 自动SQL调优(automatic sql tuning) SQL调优工具集(SQL tuning sets,STS) SQL调优顾问(SQL Tuning Advisor) 自动数据库诊断监视器(addm) 显示SQL自动调优建议最快的方法: SQL> select dbms_auto_sqltune.report_auto_tuning_task from dual; GENE