如何理解SQL审核利器goinception
这篇文章主要讲解了“如何理解SQL审核利器goinception”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解SQL审核利器goinception”吧!
一、goinception简介
使用过inception的人对SQL审核这块获取都比较熟悉,作为DBA,审核SQL是日常工作中的很重要的一块内容,审核好SQL对于后期项目以及数据库维护上起着至关重要的作用,好比一座大厦没有坚实的地基支撑,也就无法长期屹立不倒。
goInception是一个集审核、执行、备份及生成回滚语句于一身的MySQL运维工具, 通过对执行SQL的语法解析,返回基于自定义规则的审核结果,并提供执行和备份及生成回滚语句的功能。
从架构上来说,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=7max-backups=7[inc]backup_host="xxxx"backup_port=3306backup_user="goinception"backup_password="goinception"sql_safe_updates=1lang="zh-CN"[osc]osc_min_table_size=1024[ghost]ghost_on=trueghost_chunk_size=10000ghost_dml_batch_size=100
那么,我们启动goinception
./goInception-config=config/config.toml&
启动以后,我们可以看到端口4000已经启动监听了
[root@VM_0_9_centos~]#netstat-lntp|grep4000tcp600:::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-*-importpymysqlimportprettytableaspttb=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)
执行后输出如下:
[root@VM_0_9_centosgoinception]#python3test.py+----------+---------+-------------+-----------------+-----------------+----------------------------------------------------+---------------+--------------+---------------+--------------+---------+-------------+|------+---------------+--------------+---------------+--------------+---------+-------------+|order_id|stage|error_|------+---------------+--------------+---------------+--------------+---------+-------------+|order_id|stage|error_|------+---------------+--------------+---------------+--------------+---------+-------------+|order_id|stage|error_level|------+---------------+--------------+---------------+--------------+---------+-------------+|order_id|stage|error__status|------+---------------+--------------+---------------+--------------+---------+-------------+|order_id|stage|error_message|sql|affected_rows|sequence|backup_dbname|execute_time|sqlsha1|backup_time|+----------+---------+-------------+-----------------+-----------------+----------------------------------------------------+---------------+--------------+---------------+--------------+---------+-------------+|1|CHECKED|0|AuditCompleted|None|usesbtest|0|0_0_00000000|None|0|None|0||2|CHECKED|2|AuditCompleted|表't1'已存在.|createtablet1(idintprimarykey,c1int,c2int)|0|0_0_00000001|None|0|None|0||3|CHECKED|0|AuditCompleted|None|insertintot1(id,c1,c2)values(1,1,1)|1|0_0_00000002|None|0|None|0|+----------+---------+-------------+-----------------+-----------------+----------------------------------------------------+---------------+--------------+---------------+--------------+---------+-------------+
可以看到审核结果还是非常清晰的
那如果需要执行的话怎么做呢?我们只需要修改示例中的头部,将--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
表属性
列属性
索引属性检查项
默认值
自增列
ALTER
DML
INSERT
INSERT SELECT
real_row_count
,explain_ruleUPDATE/DELETE
realRowCount
,explain_rulemysql版本在5.6之前时,自动将语句转换为select做explain设置数据库sql_safe_updates
参数sql_safe_updates多表关联时,审核join语句是否包含on子句check_dml_where条件中的列是否存在隐式类型转换check_implicit_type_conversionupdate set 判断set使用了逗号还是and分隔四、使用感受
简单测试了一下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信息接口,根据用户权限,返回该用户所能看到的dbname
SQL检查接口,用户提交SQL,调用goinception进行审核,审核通过以后到DBA
SQL执行接口,DBA选择执行的实例,调用goinception进行SQL执行,执行完成以后通知开发工单完成
开发查看工单,可以下载对应的回滚SQL
感谢各位的阅读,以上就是“如何理解SQL审核利器goinception”的内容了,经过本文的学习后,相信大家对如何理解SQL审核利器goinception这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。