前言

    采用开源Yearning和inception开源软件,搭建用于MYSQL审核及线上MYSQL语句更新的审核平台。

功能说明

Yearning: 基于Vue.js与Django的整套mysql-sql审核平台解决方案。提供基于Inception的SQL检测及执行,为Inception提供可视化。

Inception:是集审核、执行、回滚于一体的一个自动化运维系统,它是根据MySQL代码修改过来的,用它可以很明确的,详细的,准确的审核MySQL的SQL语句,它的工作模式和MySQL完全相同,可以直接使用MySQL客户端来连接,但不需要验证权限,它相对应用程序(上层审核流程系统等)而言,是一个服务器,在连接时需要指定服务器地址及Inception服务器的端口即可,而它相对要审核或执行的语句所对应的线上MySQL服务器来说,是一个客户端,它在内部需要实时的连接数据库服务器来获取所需要的信息,或者直接在在线上执行相应的语句及获取binlog等,Inception就是一个中间性质的服务。

yearning.jpg

 

操作系统及IP信息

编号

服务器名称

IP

操作系统

1

Centos_6

10.21.88.51 

CentOS release 6.8 (Final) 

 

各软件版本及安装路径

编号

软件

版本信息

安装路径

代码目录

1

python

3.6.6

/usr/local/python


2

Yearning

无(最新)

/opt/Yearning


3

Inception

2.1.50

/usr/local/inception


4

nginx

1.10.2

Yum安装

 /usr/share/nginx/html

5

mysql

5.7.21

/usr/local/mysql



安装过程

依赖包安装

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

 

inception安装

复制代码

cd /opt

wget https://github.com/mysql-inception/inception/archive/master.zipmkdir -p /usr/local/inception

mkdir -p /inception/{data,logs}

unzip master.zip -d /inception

cd /inception/inception-master

cmake -DWITH_DEBUG=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/inception  -DMYSQL_DATADIR=/inception/data -DWITH_SSL=yes -DCMAKE_BUILD_TYPE=RELEASE -DWITH_ZLIB=bundled -DMY_MAINTAINER_CXX_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing  -Wno-unused-parameter -Woverloaded-virtual" -DMY_MAINTAINER_C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wdeclaration-after-statement"make && make install

复制代码

 配置

复制代码

--编辑参数文件

vim /etc/inc.cnf

[inception]

general_log=1 #这个参数就是原生的MySQL的参数,用来记录在Inception服务上执行过哪些语句,用来定位一些问题等

general_log_file=/usr/local/inception/data/inception.log #设置general log写入的文件路径

port=6669   #Inception的服务端口

socket=/usr/local/inception/data/inc.socket #Inception的套接字文件存放位置

character-set-server=utf8 #mysql原生参数

#Inception 审核规则

inception_check_autoincrement_datatype=1 #当建表时自增列的类型不为int或者bigint时报错

inception_check_autoincrement_init_value=1 #当建表时自增列的值指定的不为1,则报错

inception_check_autoincrement_name=1 #建表时,如果指定的自增列的名字不为ID,则报错,说明是有意义的,给提示

inception_check_column_comment=1 #建表时,列没有注释时报错

inception_check_column_default_value=0 #检查在建表、修改列、新增列时,新的列属性是不是要有默认值

inception_check_dml_limit=1 #在DML语句中使用了LIMIT时,是不是要报错

inception_check_dml_orderby=1 #在DML语句中使用了Order By时,是不是要报错

inception_check_dml_where=1 #在DML语句中没有WHERE条件时,是不是要报错

inception_check_identifier=1 #打开与关闭Inception对SQL语句中各种名字的检查,如果设置为ON,则如果发现名字中存在除数字、字母、下划线之外的字符时,会报Identifier "invalidname" is invalid, valid options: [a-z,A-Z,0-9,_].

inception_check_index_prefix=1 #是不是要检查索引名字前缀为"idx_",检查唯一索引前缀是不是"uniq_"inception_check_insert_field=1  #是不是要检查插入语句中的列链表的存在性

inception_check_primary_key=1 #建表时,如果没有主键,则报错

inception_check_table_comment=0 #建表时,表没有注释时报错

inception_check_timestamp_default=0 #建表时,如果没有为timestamp类型指定默认值,则报错

inception_enable_autoincrement_unsigned=1 #自增列是不是要为无符号型

inception_enable_blob_type=0 #检查是不是支持BLOB字段,包括建表、修改列、新增列操作 默认开启

inception_enable_column_charset=0 #允许列自己设置字符集

inception_enable_enum_set_bit=0 #是不是支持enum,set,bit数据类型

inception_enable_foreign_key=0 #是不是支持外键

inception_enable_identifer_keyword=0 #检查在SQL语句中,是不是有标识符被写成MySQL的关键字,默认值为报警。

inception_enable_not_innodb=0 #建表指定的存储引擎不为Innodb,不报错

inception_enable_nullable=0 #创建或者新增列时如果列为NULL,不报错

inception_enable_orderby_rand=0 #order by rand时是不是报错

inception_enable_partition_table=0 #是不是支持分区表

inception_enable_select_star=0 #Select*时是不是要报错

inception_enable_sql_statistic=1 #设置是不是支持统计Inception执行过的语句中,各种语句分别占多大比例,如果打开这个参数,则每次执行的情况都会在备份数据库实例中的inception库的statistic表中以一录存储这次操作的统计情况,每次操作对应一条记录,这条记录中含有的信息是各种类型的语句执行次数情况。

inception_max_char_length=16 #当char类型的长度大于这个值时,就提示将其转换为VARCHAR

inception_max_key_parts=5 #一个索引中,列的最大个数,超过这个数目则报错

inception_max_keys=16 #一个表中,最大的索引数目,超过这个数则报错

inception_max_update_rows=10000 #在一个修改语句中,预计影响的最大行数,超过这个数就报错

inception_merge_alter_table=1 #在多个改同一个表的语句出现是,报错,提示合成一个

#inception 支持 OSC 参数

inception_osc_bin_dir=/user/bin #用于指定pt-online-schema-change脚本的位置,不可修改,在配置文件中设置

inception_osc_check_interval=5 #对应OSC参数--check-interval,意义是Sleep time between checks for --max-lag.

inception_osc_chunk_size=1000 #对应OSC参数--chunk-size

inception_osc_chunk_size_limit=4 #对应OSC参数--chunk-size-limit

inception_osc_chunk_time=0.1 #对应OSC参数--chunk-time

inception_osc_critical_thread_connected=1000 #对应参数--critical-load中的thread_connected部分

inception_osc_critical_thread_running=80 #对应参数--critical-load中的thread_running部分

inception_osc_drop_new_table=1 #对应参数--[no]drop-new-table

inception_osc_drop_old_table=1 #对应参数--[no]drop-old-table

inception_osc_max_lag=3 #对应参数--max-lag

inception_osc_max_thread_connected=1000 #对应参数--max-load中的thread_connected部分

inception_osc_max_thread_running=80 #对应参数--max-load中的thread_running部分

inception_osc_min_table_size=0 # 这个参数实际上是一个OSC的开关,如果设置为0,则全部ALTER语句都走OSC,如果设置为非0,则当这个表占用空间大小大于这个值时才使用OSC方式。单位为M,这个表大小的计算方式是通过语句:"select (DATA_LENGTH + INDEX_LENGTH)/1024/1024 from information_schema.tables where table_schema = 'dbname' and table_name = 'tablename'"来实现的

inception_osc_on=0 #一个全局的OSC开关,默认是打开的,如果想要关闭则设置为OFF,这样就会直接修改

inception_osc_print_none=1 #用来设置在Inception返回结果集中,对于原来OSC在执行过程的标准输出信息是不是要打印到结果集对应的错误信息列中,如果设置为1,就不打印,如果设置为0,就打印。而如果出现错误了,则都会打印

inception_osc_print_sql=1 #对应参数--print

#备份服务器信息,注意改成你的机器.用于回滚。

inception_remote_system_password=P@ssw0rd

inception_remote_system_user=incep_rw

inception_remote_backup_port=3306inception_remote_backup_host=10.10.3.70inception_support_charset=utf8 #表示在建表或者建库时支持的字符集,如果需要多个,则用逗号分隔,影响的范围是建表、设置会话字符集、修改表字符集属性等

复制代码

 

启动及检测

复制代码

nohup /usr/local/inception/bin/Inception --defaults-file=/etc/inc.cnf  & netstat -tulpn | grep 6669       //inception的默认端口是6669/usr/local/inception/bin/mysql -uroot -h127.0.0.1 -P6669  //联接inception,和mysql一样的方式inception get variables;    //查看inception的所有参数

复制代码

 

安装PYTHON

复制代码

cd /usr/local/src

tar -xvf Python-3.6.6.tgz

mkdir -p /usr/local/python/3.6.6/lib

./configure --enable-shared --prefix=/usr/local/python/3.6.6 LDFLAGS="-Wl,-rpath /usr/local/python/3.6.6/lib"make && make install

 

软连接

cp /usr/bin/python /usr/bin/python2.6.6ln -fs /usr/local/python/3.6.6/bin/python3.6 /usr/bin/python

ln -fs /usr/local/python/3.6.6/bin/pip3 /usr/bin/pip

python -v

Yum修改

vi /usr/bin/yum

将头部 #!/usr/bin/python 修改为 #!/usr/bin/python2.6.6

复制代码

 

Yearning安装

cd /opt

git clone https://github.com/cookieY/Yearning.git

 

 编辑 Yearning/src/deploy.conf

复制代码

[mysql]

db = 所创建的库名

address = 数据库地址

port = 数据库端口

password = 数据库密码

username = 数据库用户

 

[host]

ipaddress = 服务器ip地址   (消息推送时显示平台地址)

复制代码

 

由于Inception 并不原生支持pymysql,所以需更改pymysql相关源码 注: 在install 文件夹下已经修改的connections.py 和 cursors.py 直接替换即可

pip3 install -r requirements.txt  #安装相应python依赖库

python3 manage.py makemigrations core && python3 manage.py migrate core #初始化数据库

echo "from core.models import Account;Account.objects.create_user(username='admin', password='Yearning_admin', group='admin',is_staff=1)" | python manage.py shell #添加初始化用户

echo "from core.models import grained;grained.objects.get_or_create(username='admin', permissions={'person': [], 'ddl': '1', 'ddlcon': [], 'dml': '1', 'dmlcon': [], 'dic': '1', 'diccon': [], 'dicedit': '0', 'user': '1', 'base': '1', 'dicexport': '0', 'query': '1', 'querycon': []})" | python manage.py shell #初始化权限

echo "from core.models import globalpermissions; globalpermissions.objects.get_or_create(authorization='global', inception={'host': '', 'port': '', 'user': '', 'password': '', 'back_host': '', 'back_port': '', 'back_user': '', 'back_password': ''}, ldap={'type': '', 'host': '', 'sc': '', 'domain': '', 'user': '', 'password': ''}, message={'webhook': '', 'smtp_host': '', 'smtp_port': '', 'user': '', 'password': '', 'to_user': '', 'mail': False, 'ding': False}, other={'limit': '', 'con_room': ['AWS', 'Aliyun', 'Own', 'Other'], 'foce': '', 'multi': False, 'query': False, 'sensitive_list': [], 'sensitive': ''})" | python manage.py shell #初始化动态配置信息

cp -rf Yearning/webpage/dist/* $NGINX_HOME/html/   #复制编译好的静态文件到nginx html目录下(如自行更改Nginx静态路径地址则将静态文件复制到对应静态文件目录下)

systemctl start nginx  #启动nginx

$PYTHON_HOME/bin/gunicorn  settingConf.wsgi:application -c gunicorn.conf #启动django

默认账号: admin  密码:Yearning_admin

 

使用说明

需要先行创建用户(Yearning的权限分为管理员及使用人两个选项,缺省只有admin管理员账号,用于审核,请创建:使用人账号用于提交的MYSQL审核),输入用户名密码登录:

112.jpg


用户
登录后点击“管理”,如下图红色圆圈部分

113.jpg

 

点击“用户”进行用户 添加。(例:如下添加了一个appuser使用人用户)

114.jpg


数据库设置
(配置用于连接审核的数据库信息,如下设置了一个测试连接)

115.jpg


设置
(inception相关设置,其它设置略)

116.jpg

如上相关“管理”下的“用户”“数据库”“设置”后,就可以进行数据审核操作了。

工单的提交和审核

工单提交

采用使用者登录后创建工单,如下图:(信息填写好后,先检测无误后提交)

 

审核(采用管理员账户登录,进入如下界面审核)

118.jpg

 

点击待审核对应工单的“操作”进入如下界面:

119.jpg

执行操作既完成审核操作。


回滚操作:(管理员执行,且必须进行inception备份服务器的相关设置)
120.jpg

工单审批后,在如下图位置有“查看回滚语句”,进入如下界面后点击提交工单,再次审批既完成回滚操作。

    以上为Yearning和inception搭建的MySQL审核平台,及简单使用介绍,关于Yearning的详细使用可以参考其官方文档。