快乐学习
前程无忧、中华英才非你莫属!

Day34-MySQL自动化运维篇--SQL审核

前言

接下来章节会重点描述数据库自动化运维介绍,很多时候,开发给运维传过来非常复杂的SQL语句,各种逻辑,嵌套在其中,如果不是专业DBA型的人员,就只能简单验证一下这条SQL是否有语法错误,是否可以执行,是否里面应用了索引等!然后就可能不会深层次的考虑是否会影响数据库当前的状态,其实如果精力有限也没有大量的时间花费其上!

因为日常工作中,大多数运维人员很多都是接受到SQL,然后在执行SQL,很多公司可能需要人为在备库上进行测试和验证等等等~,但是正在执行大量任务的在线数据环境,发生不可预估的问题,是很常有的事情,即使在备库测试,也不能得到比较安心的结果。

数据库出事了,导致不能回滚了,数据库性能暴跌了,业务阻塞了,谁来背锅,当然是执行者!哈哈,不要担心!

我们多学点数据库的知识,定好规范,和提高对SQL语句的审查能力就可以了~。

教你怎么在职场拒绝它人(看解说)

故事角色:A  (客户:需求方)  、DBA(乙方:执行者)    、DBA领导

A说:DBA大哥给我来份数据

DBA说:不好意思小弟,这里面有隐私数据不能给你!

A说:好的大哥,我帮您把具体不含隐私的数据范围指定出来了!就这些,帮我弄一下把?      

DBA说:不行啊,怎么多几百兆的数据,我怕影响服务器安全和性能。

A说:大哥,我们可以指定策略,业务低峰的时候,可以写个定时脚本在半夜导下。

DBA说:小弟,我们有规范,不能你想怎么搞就这么搞。

解说: 一般怕担责任,都会说一些别人不知道的规范来搪塞,其实他也不知道自己说的是啥玩意!

       小编技术角度详解:

       估计也是怕出问题,半夜如果数据库故障,没有人在场,第二天所有业务系统都得堵塞,瘫痪!

       如果没有值晚班的同事,甚至没有数据库服务器的监控,甚至连出问题了切换的备库都木有!

       一旦故障,就真故障了,而且还是gameover了!

 

A说:你们有什么规范,按照规范就是了。

DBA说:不清楚具体xxx,我得问问我领导,然后@领导。

DBA领导说这个我也不特别清楚,我得@上一层领导.

解说:其实是个不想给你办事的比较不错的办法,不是我不想给你办,领导没有回复,我也没有办法啊~,我母鸡丫!

A说:“你们领导都有谁,我亲自挨个找一圈,效率比较快些,然后就得给我办了不是?”

DBA领导说:"我们架构不行,技术不行,DBA垃圾,你得给我们弄一个比较牛掰的方案,然后我们才能执行!"

解说:这招很高明,破罐子破摔,说自己就是很垃圾,就是办不了,你能拿我怎么办?

然后还比较无敌的一招,无耻+卖萌:除非你能带我们飞啊)

A无语:本身不是DBA出身,弄那玩意干撒,你怎么不让小学生跟你一起打王者农药嘞!

<span style="font-family: Monaco, Menlo, Consolas, &apos;Courier New&apos;, monospace;"--<------------------------------------------------------------------------------------------------------------------

总结:其实上一则小故事,不是教大家这怎么去拒绝他人,而是希望大家不要忽视SQL审核。(引起大火的原因,就是很平常的扔个带点火星子的烟头!)

一、关于Inception

MySQL语句的审核,在业界都已经基本被认同了,实际上也是对MySQL语句写法的统一化,标准化,而之前的人工审核,针对标准这个问题其实是很吃力的,标准越多,DBA越累,开发也越累。 那么在这个都追求自动化运维的时代,审核也必须要跟上步伐,因此Inception诞生了。而Inception可以做的工作远不止是一个自动化审核工具,同时还具备执行,生成对影响数据的回滚语句(类似闪回的功能),这样一条龙服务的工具,将会给DBA的工作带来翻天覆地的变化,DBA从此就从繁重的审核、登上去执行,出错了很难回滚(如果提前没有备份的话)的被动局面解放了出来,突然发现,做DBA原来可以这么轻松,工作可以不饱和了,那就有更多的自由时间学习、进一步向自动化运维平台的实现等更智能化的方向去发展,是具有里程碑意义的。

声明

Inception是一个开源系统,每个人或者每个公司都可以自由使用,由于MySQL代码的复杂性,在审核过程中不可能入戏太深,主要是将最重要的审核完成即可,面对很多复杂的子查询、表达式等是不容易检查到的,所以有些就直接忽略了,那么大家在使用过程中,有任何疑问或者发现任何BUG,都直接提出来,我们大家一起将Inception维护得更好。

同时还有另一个很重要的原因,不同公司对SQL语句的使用习惯不同,也许针对去哪儿网http://www.qunar.com来说,现在已经正常在线上服务很长时间,也没什么大的问题,而到其它公司了,则可能会遇到比较多问题,这是可以原谅的,也许是水土不服吧!!那么针对这些问题,还是请大家尽管提出来,我们大家一起将Inception维护得更好。

平时工作压力比较大,这个工具首先是为了解决问题的,可能还会存在一些没有测试过的代码,有些地方可能也是值得推敲的,还有待优化,本人会不遗余力的维护好,不断的改进,争取成为一个功能更加完善,使用更加友好的系统,同时正在酝酿一些新的更高大上的功能,敬请期待。

文档地址:

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

联系方式

王竹峰

二、安装篇

由于作者,可能写的比较着急了,安装篇写的太cao了,只能看看,在安装 篇被坑过网友详细的总结,照着现成的走一遍,但愿不会出问题!

参考:Inception 安装步骤(CentOS系统)(http://blog.itpub.net/27808137/viewspace-1816388/

写在前边:
Inception是由去哪儿网的DBA大神开发的一款自动审核SQL的开源工具。在对文档进行拜读之后进行安装的时候发现文档中的安装步骤并不是很详细。中间遇到很多问题。所以自己整理了一下详细的安装步骤。希望大家指教
官方文档地址:http://mysql-inception.github.io/inception-document/chapter1/
安装步骤:
#yum install cmake bison ncurses-devel gcc gcc-c++ openssl-devel
#cd /data
#mkdir /usr/local/inception -P --这里创建的是Inception的安装目录。可根据自己的情况自行决定
#mkdir inception
#cd inception
#wget https://github.com/mysql-inception/inception/archive/master.zip
#unzip master
#cd inception-master/
#cmake .
#cmake -DWITH_DEBUG=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/inception -DMYSQL_DATADIR=/data/inception -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
# cat /etc/inc.cnf
[inception]
general_log=1 #这个参数就是原生的MySQL的参数,用来记录在Inception服务上执行过哪些语句,用来定位一些问题等
general_log_file=/usr/local/inception/data/inception.log #设置general log写入的文件路径
port=6669 #Inception的服务端口
socket=/data/inception/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=1 #建表时,表没有注释时报错
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=/data/temp #用于指定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=1 # 这个参数实际上是一个OSC的开关,如果设置为0,则全部ALTER语句都走OSC,如果设置为非0,则当这个表占用空间大小大于这个值时才使用OSC方式。单位为M,这个表大小的计算方式是通过语句:"select (DATA_LENGTH + INDEX_LENGTH)/1024/1024 from information_schema.tables where table_schema = &apos;dbname&apos; and table_name = &apos;tablename&apos;"来实现的
inception_osc_on=1 #一个全局的OSC开关,默认是打开的,如果想要关闭则设置为OFF,这样就会直接修改
inception_osc_print_none=1 #用来设置在Inception返回结果集中,对于原来OSC在执行过程的标准输出信息是不是要打印到结果集对应的错误信息列中,如果设置为1,就不打印,如果设置为0,就打印。而如果出现错误了,则都会打印
inception_osc_print_sql=1 #对应参数--print
#inception_user #这个用户名在配置之后,在连接Inception的选项中可以不指定user,这样线上数据库的用户名及密码就可以不暴露了,可以做为临时使用的一种方式,但这个用户现在只能是用来审核,也就是说,即使在选项中指定--enable-execute,也不能执行,这个是只能用来审核的帐号。
#inception_password #与上面的参数是一对,这个参数对应的是选项中的password,设置这个参数之后,可以在选项中不指定password
inception_read_only=0 #设置当前Inception服务器是不是只读的,这是为了防止一些人具有修改权限的帐号时,通过Inception误修改一些数据,如果inception_read_only设置为ON,则即使开了enable-execute,同时又有执行权限,也不会去执行,审核完成即返回
#备份服务器信息
inception_remote_system_password=123456
inception_remote_system_user=root
inception_remote_backup_port=3306
inception_remote_backup_host=192.168.1.54
inception_support_charset=utf8 #表示在建表或者建库时支持的字符集,如果需要多个,则用逗号分隔,影响的范围是建表、设置会话字符集、修改表字符集属性等

启动:
#nohup /usr/local/inception/bin/Inception --defaults-file &

三、使用篇

暂时略

打赏
赞(0) 打赏
未经允许不得转载:同乐学堂 » Day34-MySQL自动化运维篇--SQL审核

特别的技术,给特别的你!

联系QQ:1071235258QQ群:710045715

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

error: Sorry,暂时内容不可复制!