Inception安装部署实现SQL自动审核与上线

2024-04-02 05:18

本文主要是介绍Inception安装部署实现SQL自动审核与上线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

1  Incption概述

1.1  Inception简介

Inception是集审核、执行、回滚于一体的一个自动化运维系统,它可以对提交的所有语句的语法分析,如果语法有问题,都会将相应的错误信息返回给审核者。 还提供SQL语句的执行功能,可执行的语句类型包括常用的DML及DDL语句及truncate table等操作。 Inception在执行 DML时还提供生成回滚语句的功能,对应的操作记录及回滚语句会被存储在备份机器上面,备份机器通过配置Inception参数来指定。

源码地址:https://github.com/mysql-inception/inception

文档地址:http://mysql-inception.github.io/inception-document/

##20181115更新

此篇博文已年代久远,而且已经出现了基于Inception比较好用的web界面操作平台,分别是archer和yearning,下面附上这2个的github地址,读者可以自己选择使用哪个平台。

https://github.com/jly8866/archer

https://github.com/cookieY/Yearning

Inception源地址已没有源码,可以打开源地址,然后在右上角上面的fork处选择新的下载地址。

2  Incption安装

2.1  下载源码包

https://github.com/mysql-inception/inception

download zip

2.2  安装编译时的依赖

yum install gcc gcc-c++ cmake bison openssl-devel ncurses-devel –y

2.3  开始安装

unzip inception-master.zip

cd inception-master

./inception_build.sh debug [Xcode]

2.4  编辑配置文件

vim /etc/inc.cnf

[inception]

general_log=1

general_log_file=inc.log

port=6669

socket=/tmp/inc.socket

character-set-client-handshake=0

character-set-server=utf8

inception_remote_system_password=thunder

inception_remote_system_user=thunder

inception_remote_backup_port=3306

inception_remote_backup_host=127.0.0.1

inception_support_charset=utf8

inception_enable_nullable=0

inception_check_primary_key=1

inception_check_column_comment=1

inception_check_table_comment=1

inception_osc_min_table_size=1

inception_osc_bin_dir=/usr/bin

inception_osc_chunk_time=0.1

inception_ddl_support=1

inception_enable_blob_type=1

inception_check_column_default_value=1

 

#相关配置说明请参见官方文档,在概述中已给出地址

2.5  启动Inception服务,类似mysql启动方式

/opt/thunder/inception-master/debug/mysql/bin/Inception --defaults-file=/etc/inc.cnf &

登陆测试,可通过sock或者端口,上面配置文件中配置的端口为6669

mysql –h127.0.0.1 –P6669 –uroot

mysql> inception get variables;

输出相关变量则安装成功

2.6  用脚本测试相关审核语句

 

#!/usr/bin/python 
import MySQLdb 
sql='/*--user=thunder;--password=thunder;--host=127.0.0.1;--enable-remote-backup=0;--execute;--port=3306;*/\ 
inception_magic_start;\ 
use test;\ 
CREATE TABLE `alifeba_user` (\ 
     `ID` int(11) unsigned NOT NULL auto_increment comment "aaa",\ 
     `username` varchar(50) NOT NULL Default "" comment "aaa",\ 
     `realName` varchar(50) NOT NULL Default "" comment "aaa",\ 
     `age` int(11) NOT NULL Default 0 comment "aaa",\ 
     PRIMARY KEY (`ID`)\ 
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT="AAAA";\ 
inception_magic_commit;' 
try: 
    conn=MySQLdb.connect(host='127.0.0.1',user='',passwd='',db='',port=6669) 
    cursor=conn.cursor() 
    cursor.execute(sql) 
    results = cursor.fetchall() 
    column_name_max_size=max(len(i[0]) for i in cursor.description) 
    row_num=0 
    for result in results: 
        row_num=row_num+1 
        print '*'.ljust(27,'*'),row_num,'.row', '*'.ljust(27,'*') 
        row = map(lambda x, y: (x,y), (i[0] for i in cursor.description), result) 
        for each_column in row: 
            if each_column[0] != 'errormessage': 
                print each_column[0].rjust(column_name_max_size),":",each_column[1] 
            else: 
                print each_column[0].rjust(column_name_max_size),':',each_column[1].replace('\n','\n'.ljust(column_name_max_size+4)) 
    cursor.close() 
    conn.close() 
except MySQLdb.Error,e: 
     print "Mysql Error %d: %s" % (e.args[0], e.args[1]) 

 

 

执行测试脚本

 

python inc.py 
*************************** 1 .row ***************************
           ID : 1
        stage : RERUN
     errlevel : 0
  stagestatus : Execute Successfully
 errormessage : None
          SQL : use test
Affected_rows : 0
     sequence : '1487924011_2298_0'
backup_dbname : None
 execute_time : 0.000
      sqlsha1 : 
*************************** 2 .row ***************************
           ID : 2
        stage : EXECUTED
     errlevel : 0
  stagestatus : Execute Successfully
 errormessage : None
          SQL : CREATE TABLE `alifeba_user` (     `ID` int(11) unsigned NOT NULL auto_increment comment "aaa",     `username` varchar(50) NOT NULL Default "" comment "aaa",     `realName` varchar(50) NOT NULL Default "" comment "aaa",     `age` int(11) NOT NULL Default 0 comment "aaa",     PRIMARY KEY (`ID`))ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT="AAAA"
Affected_rows : 0
     sequence : '1487924011_2298_1'
backup_dbname : 127_0_0_1_3306_test
 execute_time : 0.010
      sqlsha1 : 

成功

3  inception_web安装

3.1  inception_web简介

inception_web是web封装的界面,可以通过web界面来实现相关功能,用python写的,目前比较简单,后面的需求需要自己开发

源码地址:https://github.com/dbalihui/inception_web

打开地址后,可以看到:

数据库运维平台

已实现功能:

表结构语法审核

环境配置

python2.7 + flask

先安装依赖模块

pip install flask_wtf

pip install flask-script

pip install flask-debugtoolbar

pip install MySQL-python

使用方法

先将app目录中的inception.py文件里的账号密码改成自己的

记得use sql_check这里要改成自己的数据库名字

在inception_web目录下运行./run.py runserver --host 0.0.0.0

使用浏览器访问你的IP http://192.168.xx.xxx:5000/

运行报错的话是因为没有安装flask组件,请使用pipinstall xx安装相关组件

我的系统是python版本为2.6.6所以我们需要先升级python

3.2  升级python到2.7

# wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz --no-check-certificate

# tar -xvf Python-2.7.10.tar

# cd Python-2.7.10

# ./configure

# make –j 8 && make install

# /usr/local/bin/python -V

# mv /usr/bin/python /usr/bin/python2.6.6

# ln -s /usr/local/bin/python /usr/bin/python

# python -V //验证版本

# vim /usr/bin/yum   //修改#!/usr/bin/python 为#!/usr/bin/python2.6.6,因为yum安装依赖的是2.6版本的python

3.3  安装incpetion_web依赖模块

# yum -y install python-pip   //yum安装的是2.6版本的pip

# wget https://bootstrap.pypa.io/ez_setup.py  --no-check-certificate  //下载一个ez_setup 安装pip2.7版本的

# python2.7 ez_setup.py

# easy_install-2.7 pip

# pip2.7 install flask_wtf

# pip2.7 install flask-script

# pip2.7 install flask-debugtoolbar

# pip2.7 install MySQL-python //如果安装报错yuminstall mysql-devel –y

3.4  修改配置文件

# unzip inception_web-master.zip

# cd inception_web-master/app

# vim inception.py

#coding=utf-8

 

import MySQLdb

 

def table_structure(mysql_structure):

    sql1=' /*--user=thunder;--password=thunder;--host=127.0.0.1;--execute=1;--port=3307;*/\

           inception_magic_start;\

            use test;' //此处为默认选择数据库,如果在web不加use会默认对该库操作,对于生产库请慎重选择,建议最好创建一下与业务无关的库,在执行SQL的时候加上usedbname;

   sql2='inception_magic_commit;'

    sql = sql1 +mysql_structure + sql2

    try:

       conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='',port=6669,use_unicode=True,charset="utf8")

        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 "MysqlError %d: %s" % (e.args[0], e.args[1])

returnresult[1][4].split("\n")

3.5  启动inception_web

# cd inception_web-master

# ./run.py runserver --host 0.0.0.0

在浏览器中访问服务器http://IP:5000就可以访问页面了

 

4  相关说明

4.1  在页面中进行SQL操作时,如果提示为None,则代表语句执行成功,如果语句有问题,请按相关提示修改SQL,并再次执行

 

4.2  配置了备份库后,语句执行后,会在备份数据库创建一个库名为IP_PORT_DBNAME的库,里面有相关操作时对表的备份以及记录,其中$_$Inception_backup_information$_$表为对该库进行操作的所有记录,可以通过该表来查看对该库名上的数据库做了哪些修改。

mysql> select * from $_$Inception_backup_information$_$\G

*************************** 1. row ***************************

        opid_time:1460022412_6348032_1

start_binlog_file: mysql-bin.000019

 start_binlog_pos: 85611296

  end_binlog_file:mysql-bin.000019

   end_binlog_pos: 85611498

    sql_statement: deletefrom test.test where id=1

             host:192.168.199.58

           dbname: test

        tablename: test

             port: 3307

             time:2016-04-07 17:46:52

             type: DELETE

6 rows in set (0.00 sec)

4.3  如果开启了统计功能,在备份库的inception库中会创建一张名为statistic的表,里面记录了所有执行过的语句类型

mysql> desc statistic;

+--------------+------------+------+-----+-------------------+----------------+

| Field        | Type       | Null | Key | Default           | Extra          |

+--------------+------------+------+-----+-------------------+----------------+

| id           | bigint(20)| NO   | PRI | NULL              | auto_increment |

| optime       |timestamp  | NO   |    | CURRENT_TIMESTAMP |               |

| usedb        |int(11)    | NO   |    | 0                 |                |

| deleting     |int(11)    | NO   |    | 0                 |                |

| inserting    |int(11)    | NO   |    | 0                 |                |

| updating     |int(11)    | NO   |    | 0                 |                |

| selecting    |int(11)    | NO   |    | 0                 |                |

| altertable   |int(11)    | NO   |    | 0                 |                |

| renaming     |int(11)    | NO   |    | 0                 |                |

| createindex  |int(11)    | NO   |    | 0                 |                |

| dropindex    |int(11)    | NO   |    | 0                 |                |

| addcolumn    |int(11)    | NO   |    | 0                 |                |

| dropcolumn   |int(11)    | NO   |    | 0                 |                |

| changecolumn | int(11)   | NO   |     | 0                 |                |

| alteroption  |int(11)    | NO   |    | 0                 |                |

| alterconvert | int(11)   | NO   |     | 0                 |                |

| createtable  |int(11)    | NO   |    | 0                 |                |

| droptable    |int(11)    | NO   |    | 0                 |                |

| createdb     |int(11)    | NO   |    | 0                 |                |

| truncating   |int(11)    | NO   |    | 0                 |                |

+--------------+------------+------+-----+-------------------+----------------+

20 rows in set (0.01 sec)

通过select可以查询出相关操作的条数,方便统计

这篇关于Inception安装部署实现SQL自动审核与上线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869071

相关文章

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.