SQL审核工具goInception示例讲解

本文主要对goInception工具作一些简单介绍,并举例说明其主要作什么。mysql

介绍

goInception是一个集审核、执行、备份及生成回滚语句于一身的MySQL运维工具, 经过对执行SQL的语法解析,返回基于自定义规则的审核结果,并提供执行和备份及生成回滚语句的功能。git

goInception基于TiDB的语法解析器,和业内有名的inpcetion审核工具重构。github

面向读者:该文主要面向于后端开发、DBA或运维小伙伴,经过举例说明goInception大概作了哪些事,关于安装和使用等都可以查看 使用文档github项目首页。另外,除安装之外,如今不少inception相关的资料和文章等,都可查阅,不少都是通用的。sql

架构图:(摘自inception) 数据库

架构图

goInception相似于mysql服务,能够链接到服务端口,执行SQL语句。 接下来经过一个示例来讲明goInception具体作了哪些操做。后端

审核示例

在调用goInception时,须要指定要访问的生产库地址,因此须要一种特殊语法形式, goInception延用inception的使用方式,在审核的sql开始前添加注释来指定远端服务器,并在sql的先后添加特殊标识以区分待审核语句,示例以下:服务器

/*--host=127.0.0.1;--port=3306;--user=xxx;--password=xxx;--check=0;*/
inception_magic_start;
use db;
一个或多个sql,支持大多数DDL和DML语法;
inception_magic_commit;
复制代码

各选项说明

参数 默认值 数据类型 说明
host '' string 线上数据库IP地址
port 0 int 线上数据库端口
user '' string 线上数据库用户名
password '' string 线上数据库密码
check false bool 开启审核功能
execute false bool 开启执行功能
backup false bool 开启备份功能,仅在执行时生效
ignore_warnings false bool 是否忽略警告,仅在执行时生效。该参数控制有警告时是继续执行仍是停止

要审核的语句:微信

create table dbtest.table1(
    id int unsigned auto_increment primary key,
    name varchar(20)
    ) engine = innodb default character set utf8;
insert into dbtest.table1 values(1,'aaa'),(2,'bbb');
复制代码

那调用时能够变为以下形式:架构

/*--host=127.0.0.1;--port=3306;--user=xxx;--password=xxx;--execute=1;--backup=1;--ignore_warnings=1;*/
inception_magic_start;
use dbtest;
create table table1(
    id int unsigned auto_increment primary key,
    name varchar(20)
    ) engine = innodb default character set utf8;
insert into table1 values(1,'aaa'),(2,'bbb');
inception_magic_commit;
复制代码

其中,运维

  • 为了方便,能够经过use切换数据库,上下文自动保持该数据库
  • 为讲述更多涉及的功能,咱们开启了执行和备份参数,此时仍会先进行审核,只有在审核经过以后才会真正执行

goInception内部会进行三个阶段的操做,分别是审核阶段,执行阶段和备份阶段,接下来逐一讲解。

审核阶段

  1. goInception在收到sql语句后,先会解析注释中的远程数据库配置,并创建链接
  2. 若是开启了备份功能,则会检查binlog日志是否开启(log_bin=ON)
  3. 判断语法开始位置,必须以 inception_magic_start 语法开始
  4. 开始逐行解析,并进行语法树解析,失败时返回
  5. 解析到use dbtest,会经过show databases判断数据库是否存在
  6. 解析到create table table1...,接下来进行建表的校验
    • 判断库、表是否存在
    • 表名、列名长度校验,关键字校验
    • 存储引擎校验,表/列的字符集和注释校验
    • 列名重复性校验
    • 自增列个数校验,自增列列名校验,起始值校验,建议添加unsigned属性
    • 外键校验,分区表校验
    • 列类型校验,部分类型有设置开关,开启后才能使用,char也会建议改成varchar类型
    • 默认值校验,日期格式校验
    • not null约束校验
    • 索引名校验,前缀校验,长度校验,表索引个数,索引列数,索引列重复性校验
    • 上面列出了大部分会进行的逻辑校验,顺序上和实际顺序会有差别,这些审核规则大都有开关设置,详细参数可查看 审核规则
  7. 解析到insert into table1 ...,接下来进行insert的校验
    • 判断表、列是否存在
    • 判断insert列数和值列表是否一致
    • 检查不为null的列,是否指定了null
    • 检查列是否重复指定
    • 若是使用了insert select语法,会审核select语法是否有不存在的表或列
  8. 解析到inception_magic_commit,判断全部的审核是否成功,若是有错误时,直接返回,而有警告时会判断是否开启了忽略警告的参数,以判断是否进行下一步

执行阶段

  • 只有在审核成功时(或有警告但启用了忽略),才会进入执行阶段
  • 有些语法是不会执行的,其在审核阶段已经执行,好比desc table1;语法

接下来继续说明执行阶段:

  1. 在执行阶段,DDL语句和DML语句走不一样的逻辑,其中DML经过binlog解析实现回滚,而DDL语句根据语法树规则直接生成逆向SQL便可
  2. DML:在开始执行和执行完成时,记录binlog位置
  3. DDL和DML:开始执行,并在执行失败时记录失败缘由并结束执行操做,成功时记录受影响行数
  4. 执行中可能想要执行KILL以停止执行,可查看 KILL操做说明

备份阶段

备份功能的详细说明请查看 备份功能

  1. 到达备份阶段有两种状况,可能执行成功也可能部分红功了,此时会进行判断,只备份执行成功的语句
  2. DDL的备份是保存自动生成的逆向SQL语句
  3. DML的备份是根据执行先后记录的binlog位置和线程号,模拟从库的形式获取binlog信息,并作事件解析
  4. 解析binlog日志要求binlog格式必须为ROW模式,该模式也会有备份前检查和自动设置,所以可能须要SUPER权限
  5. 在解析过binlog后,会生成逆向的SQL语句,并异步批量写入备份库
  6. 在回滚语句写入完成后,全部操做执行完成,并返回结果给客户端。

交流与反馈

欢迎经过Github Issues提交问题报告与建议

QQ群: 499262190

微信:

相关文章
相关标签/搜索