自动审核:
在日常的DBA工作中,表结构的审核并上线,表结构的修改审核并上线,占据了工作的很大时间,尤其是在产品快速迭代、快速试错阶段,这样,DBA同学们就会陷入所谓的审核SQL的无限制的机械运动中《新建表、改表》。
所谓审核,我个人认为就是一系列的条件规则,然后像套公式似的,把SQL往里套,鉴于此,我们自己就设计了一套自动审核系统,极大的加快审核流程。当然了,很多细小的规则随着数据库版本、线上硬件环境也会有一些改变,审核的准确性也会受到一些影响,但是如果审核系统能帮我们搞定一些初级的小问题,我就心满意足了。
在做系统之前,根据经验就制定了一些规则:如下,当然不是所有的都跟性能有直接关系,有的只是为了追求美观、追求极致而设定。
1、表结构是否合法
//不合法当然不能通过
2、表名、列名长度超过 16
//主要跟我们自己的授权有关系
3、必须有 unsigned
//业务最容易忘记添加,当然如果一定要负值,那么就走人工审核;
4、必须为 InnoDB
//当然了,我已经忘记还有MyISAM了,统计系统除外
5、int bigint(10) 不能小于 10
//大家见过int(1)的情况么?
6、varchar 长度小于 3000 //
这也算是一个人为规定,没有任何意义
7、text 字段个数不能大于 3
//人为规定而已
8、主键必须为 int 类型 //不int,真的会死人
9、索引不能有重复 //见过key(id),key(id,uid)的情况吗?
10、索引个数不能大于 5 个(包括主键)
//人为定义而已
11、索引字段必须为 not null,并且有 default
值
//参照高性能那本书说的,其实不一定影响性能
12、SQL 是否使用到索引 //不能用到索引的SQL,真的很惨
13、SQL 中不能有 * //由于*
经常导致流量、O巨大,所以,也强制了
14、自增字段必须为 int 或者 bigint
//见过自增用smallint的吗?然后一下就溢出了
15、请不要使用非 MySQL 保留字(Reserved Words)
//写脚本,大家讨厌符号么?
规则设计好了,那么就是嵌入我们的Hulk平台了,在用户平台,业务根据业务标记,提供Create
SQL、Alter
SQL已经线上运行的SELECT,提交后,会直接调用后端审核程序,程序根据以上规则,进行审核,如果审核不通过,那会直接退回业务人员,并给出除了哪个规则,业务人员根据反馈修改,在SQL为通过审核前,DBA是完全不用参与,也根本不知道业务提过需求,这样,就极大的降低了DBA的工作量。
这个系统有一些挑战:
1、因为MySQL的SQL语法非常非常的多,尤其是Alter
SQL,无法兼容所有的SQL,例如:多个add column、create
index与add
index、modify与change等;如果处理不好,会造成业务人员的极大困惑,本来没有问题的,但是自动审核就是不通过;
2、业务会把insert语句也传到Hulk平台审核、或者符号的控制
,更有甚至,传的SQL就是错误的,还有库名、表名不正确,或者添加一个本已经有的字段,根本就防不慎防;
3、在每行结果的注释#,控制起来也麻烦;
自动上线:
自动审核完毕,当然我们就需要上线了,这里,我们也期望不要通过人为的去登录MySQL,建表、改表,造成大量的无价值的机械运动。
建表上线:这个比较简单,审核通过,我们只需要根据业务标记,让Hulk调用上线程序直接在数据库中执行SQL即可;
改表上线:这个能直接上线吗?当然,在极大部分情况下,我们是直接上线的,规则一些规则:
1、表小于10w行,小于10M空间大小,那么直接执行SQL;
2、如果不满足1,并且满足percona
online-schema-change条件,那么通过osc工具,进行在线修改;(最大干过60G的表,当然搞了很长时间)
3、如果1、2都不行,走人工上线流程;
在99%的情况下,我们上线是不需要关心的,伙伴们可以做点更有意义的事情了。