mysql管理员审核SQL的必备利器,背锅概率至少下降50%

goinception简介

使用过inception的人对sql审核这块获取都比较熟悉,作为DBA,审核sql是日常工作中的很重要的一块内容,审核好sql对于后期项目以及数据库维护上起着至关重要的作用,好比一座大厦没有坚实的地基支撑,也就无法长期屹立不倒。

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

goinception的架构:

从架构上来说,goinception简直跟inception一模一样,sql提交到goinception,goinception连接到线上MysqL进行审核。执行的时候也是连接到线上MysqL进行执行,不同的是goinception提供了备份、回滚的功能,意思就是能够监听执行期间的binlog,基于binlog生成反向的回滚sql

安装测试

下载、安装

官方提供了二进制包,简直安装部署的一大福利。

下载地址:https://github.com/hanchuanchuan/goInception/releases

下载好对应版本的goinception,直接解压即可,解压完成以后在config/config.toml.default有一个认的配置文件,大概意思也写得比较清楚了,那我修改的部分已经写在下面的配置文件中了,其他部分我都没有修改

#日志文件

[log.file]

filename="/opt/goinception/logs/goinception.log"

max-days=7

max-backups=7

[inc]

backup_host="xxxx"

backup_port=3306

backup_user="goinception"

backup_password="goinception"

sql_safe_updates=1

lang="zh-CN"

[osc]

osc_min_table_size=1024

[ghost]

ghost_on=true

ghost_chunk_size=10000

ghost_dml_batch_size=100那么,我们启动goinception

./goInception-config=config/config.toml&

启动以后,我们可以看到端口4000已经启动监听了

[root@VM_0_9_centos~]#netstat-lntp|grep4000

tcp600:::4000:::*LISTEN31404/./goInception测试

goinception可以沿用inception的调用方法,示例如下:

/*--user=root;--password=root;--host=127.0.0.1;--check=1;--port=3306;*/

inception_magic_start;

usetest;

createtablet1(idintprimarykey);

inception_magic_commit;那么我们构建一个python脚本来进行测试:

#!/usr/bin/envpython3

#-*-coding:utf-8-*-

importpyMysqL

importprettytableaspt

tb=pt.prettytable()

sql='''/*--user=xucl;--password=xuclxucl123;--host=127.0.0.1;--check=1;--port=3308;*/

inception_magic_start;

usesbtest;

createtablet1(idintprimarykey,c1int,c2int);

insertintot1(id,c1,c2)values(1,1,1);

inception_magic_commit;'''

conn=pyMysqL.connect(host='127.0.0.1',user='',passwd='',

db='',port=4000,charset="utf8mb4")

cur=conn.cursor()

ret=cur.execute(sql)

result=cur.fetchall()

cur.close()

conn.close()

tb.field_names=[i[0]foriincur.description]

forrowinresult:

tb.add_row(row)

print(tb)执行后输出如下:

可以看到审核结果还是非常清晰的

那如果需要执行的话怎么做呢?我们只需要修改示例中的头部,将--check=1改成--execute=1即可

/*--user=xucl;--password=xuclxucl123;--host=127.0.0.1;--execute=1;--port=3308;*/

那你如果想备份的话,添加选项--backup=1即可

/*--user=xucl;--password=xuclxucl123;--host=127.0.0.1;--execute=1;--backup=1;--port=3308;*/

审核规则

goinception的审核规则可以见文档:https://hanchuanchuan.github.io/goInception/rules.html

我捡了一些我认为比较重要的审核规则,列成表格如下:

create table

1 表属性

2 列属性

3 索引属性检查项

4 UPDATE/DELETE

5 INSERT

6 SELECT

使用感受

简单测试了一下goinception,整体体验下来感觉还是很不错的,相比于之前的inception来说,goinception有如下几个优点:

安装部署非常简单,官方直接提供了二进制包集成了gh-ost无需另外安装,同时也提供pt-osc方式执行DDL提供了基于表大小的ALTER执行选项,并且可配置大小支持关联更新,inception本身是不支持的提供了更加丰富的审核规则选项,并且是基于MysqL5.7的,相比于inception来说支持度更好长期稳定更新,从github上的commit记录看作者还是更新得很勤奋的更快的备份功能,之前使用inception的时候经常会碰到需要备份的binlog过大,网络超时的现象(从文档上看goinception使用的批量备份,据说速度能快很多)

系统集成

到这里,我们已经基本上选择goinception作为我们的审核引擎了,那么如何集成到现有的自动化系统中是个问题。

先说一下我们公司的情况,我们公司有流程中心,也就是开发会在上面选择库,提交sql,DBA收到工单以后人工审核,手工执行。

在审核过程中,对于DBA来说,肉眼审核也太过于辛酸了,手工执行一不小心就是背黑锅。所以,基于goinception,我这边提供了几个restful的接口,分别如下:

db信息接口,根据用户权限,返回该用户所能看到的dbnamesql检查接口,用户提交sql调用goinception进行审核,审核通过以后到DBAsql执行接口,DBA选择执行的实例,调用goinception进行sql执行,执行完成以后通知开发工单完成开发查看工单,可以下载对应的回滚sql这样一来,DBA的双手可以大大地解放了,不仅提高了工作效率,并且能够准确无误地执行sql,减少背黑锅的概率,还提供了回滚sql功能,假如开发发现sql提交有误可以及时查看回滚sql进行数据修复。

相关文章

MySQL 死锁 是指两个或多个事务互相等待对方持有的锁,从而导...
在MySQL中,InnoDB引擎通过Next-Key Locking技术来解决幻读问...
在数据库事务管理中,Undo Log 和 Redo Log 是两种关键日志,...
case when概述 sql语句中的case语句与高级语言中的switch语句...
其实很简单,只是为了忘记,做个记录,用的时候方便。 不管是...
1.进入服务,找到mysql服务,在属性里找到mysql的安装路径 2...