12.MySQL发布审批执行自动化
写在前面
因为公司统一了标准、元数据、和模型设计,其中模型就包含了MySQL模型,用户设计完表结构之后,需要经过发布才能到线上执行(以往是邮件过来执行,审核了的还好,没审核的不执行也不行,人家都要上线了)
用户的使用习惯是通过各种SQL客户端或者IDE开发端产生DDL语句,然后交给DBA执行,现在挪到线上来产生,所以,借助数据资产的开发能力,落地MySQL审批之后的执行(其实借助archery也行,就是界面不太好看,自己又没时间开发)
一.设计思路
- 1.用户在模型设计和开发库中可双向同步表结构,确定后进行申请发布
- 2.在发布之前执行表结构评分和语法判断,目前设计好了,上线后继续调整评分标准
- 3.发布审核包含两步,评分审核,人工审核;评分就根据评分标准,达到60分审核通过直接发布,未达到60分或者含有drop语句的,人工二次审核
- 4.审核通过后,先在预发布环境执行,而后是生产环境
- 5.在预发布环境和生产环境执行前,都需要在一个沙箱环境预执行一遍,大体过程是,将目标表的结构导入沙箱,用pt工具在沙箱执行对应的DDL语句,没问题了才到目标环境执行
- 6.执行也包含了两种判断,如果是create语句,那么直接执行,如果是DDL语句,使用pt工具执行(设计之初还加入了数据库负载超过80%和表体积超过256M的判断,说太复杂被砍了)
- 7.考虑到小库小表的语句,加入是否启用pt工具执行判断,不启用的话全部走原生DDL执行。
- 8.考虑到电商活动期间访问量大,加入了是否允许执行DDL限制,这样可以在电商活动期间,关闭同步功能,防止造成锁表
- 9.考虑到DDL生成的时候或者直接在数据库执行了DDL,导致线上执行DDL报错,增加发布之后的内容跳过执行
- 10.在每个关键节点,加入邮件提醒,譬如自动审批不通过,通知DBA审批,执行DDL报错,通知DBA,DBA再决定是否需要人工干预等
二.流程图
-
1.模型设计好后,同步到开发库或者测试库
-
2.上线前进行发布,通过后才能上线(其实还设计了一个表结构评分的巡检页面,确保开发过程的表质量)
-
3.审核通过后,具有模型编辑权限的人,就可以同步模型导预发布环境和生产环境了
-
4.客户端工具肯定比web自己开发的工具好用,为保留在开发库执行的DDL可以同步回来模型设计,相当于与模型设计多了一种编辑方式,提供从开发库导入表结构到模型设计
导入时候有依赖关系,索引会依赖字段
-
5.在发起申请发布那一刻起,到执行落库,记录时间,用于后续效率的分析
-
6.同步的状态变化
三.日志格式
- 1.变更表的日志格式
变更表
预发布环境 ;如果是生产环境,则将 预发布环境 替换为 生产环境:
时间戳
原始DDL语句
时间戳 转换为沙箱环境pt命令
转换后沙箱环境的pt命令
时间戳 清除沙箱环境的表结构
时间戳 从预发布环境导出建表语句
导出命令
时间戳 导入表结构到沙箱环境
时间戳 导入表结构成功
时间戳 开始在沙箱环境执行变更
pt工具输出内容
时间戳 沙箱环境变更成功
时间戳 开始在预发布环境执行变更
转换后生产环境的pt命令
pt工具输出内容
时间戳 预发布环境变更成功
- 2.创建表日志格式
时间戳
create语句或其他DDL语句
返回内容
四.表结构评分
-
1.评分的内容可以维护在数库表,不需要在前端页面实现增删改查,毕竟只有DBA才会去改这些阈值
-
2.评分样例
1.字段引用标准个数占比:存在一个引用标准字段不扣分,权重分5分
全表至少1个字段引用了标准,则不扣分;
全表如果不存在引用标准,则-5分
最多-5分,最少-0分
样例:字段 material_config_code 参考了标准 config_id,-0分
2.有无主键:无主键扣除权重分,权重分10分
全表存在主键,不扣分
全表如果不存在主键,则-10分
最多-10分,最少-0分
样例:字段 material_config_code 是主键,-0分
3.主键是否为整形数据类型:非整形数据类型主键扣除权重分(int系列、decimal),权重分10分
如果使用了整型,则不扣分
此样例属于字符数据类型主键,属于非整形数据类型,-10分
最多-10分,最少-0分
样例:字段 material_config_code 是非tinyint/smallint/mediumin/int/bigint/decimal数据类型,-10分
4.自增列是否指定无符号:自增列不指定无符号扣除权重分,权重分5分
如果使用了自增列,并且是unsigned,则不扣分
没有使用自增列,-0分
最多-5分,最少-0分
样例:没有使用自增列,-0分
5.时间类型是否timestamp:2个以内的时间类型非timestamp扣除50%权重分,3个及以上-100%权重分,权重分5分
如果(不存在datetime,而存在timestamp)或者(两者同时不存在)则不扣分
如果使用了2个以内(含)的datetime,则-2.5分,3个及以上-5分
最多-5分,最少-0分
样例:存在6个datetime,则-5分
6.char或者varchar字符类型默认值为null个数:存在字符类型字段默认值为null,每多1个扣除权20%重分,权重分5分
该类型的默认值为null的个数>=5个,开始扣分
>=5个,-1分
>=6个,-2分
>=7个,-3分
>=8个,-4分
>=9个,-5分(全部扣除)
最多-5分,最少-0分
样例:总共43个varchar字段,41个为null,超过9个上限,则-5分
7.char或者varchar字符串类型长度超过256长度个数:长度超过256字符个数超过3个(含),每个扣除20%权重分,权重分5分
该类型的个数>=3且每一个长度>=256,开始扣分
>=3个,-1分
>=4个,-2分
>=5个,-3分
>=6个,-4分
>=7个,-5分(全部扣除)
最多-5分,最少-0分
样例:other_backup和requried_delivery_backup 超过256,共2个,未达到3个,-0分
8.char或者varchar字符串类型占表百分比:字符串类型占表字段总数超过60%,占比每多10%扣除20%,权重分10分
该类型的个数占总字段数>=60%,开始扣分
>=60%,-2分
>=70%,-4分
>=80%,-6分
>=90%,-8分
=100%,-10分(全部扣除)
最多-10分,最少-0分
样例:总共56个字段,其中43个varchar字段,占比超过60%,则-10分
9.单行数据最大长度:单行最大长度超过1024字节扣除50%权重分,超过2048扣除100%,权重分10分
单行数据长度指所有列长度之和
char/varchar 1个字符4个字节
text 65535 字节
tinyint 1字节,smallint 2字节,mediumint 3字节,int 4字节,bigint 8字节,decimal 8字节
timestamp 4字节,datetime 8字节,year 1字节,date 3字节,time 3字节
单行字节长度>=1024,开始扣分
>=1024,-5分
>=2048,-10分(全部扣除)
最多-10分,最少-0分
样例:单行长度已远远超出1024个字节,-10分
10.索引个数:索引个数超过5个,每多1个扣除10%权重分,权重分5分
除主键外,其他索引个数>=5个,开始扣分
>=6,-0.5分
>=7,-1分
>=8,-1.5分
>=9,-2分
>=10,-2.5分
>=11,-3分
>=12,-3.5分
>=13,-4分
>=14,-4.5分
>=15,-5分(全部扣除)
最多-5分,最少-0分
样例:共有两个索引,未超过阈值,-0分
11.索引前缀是否为idx_,唯一索引是否为unq_:普通索引前缀非idx_,唯一索引非unq_,每一个扣除10%权重分,权重分5
索引的命名前缀只有idx_和unq_
普通索引为idx_前缀,不扣分
每存在1个普通索引非idx_前缀,-1分
唯一索引为unq_前缀,不扣分
每存在1个唯一索引非unq_前缀,-1分
最多-5分,最少-0分
样例:共有两个普通索引,均为idx_前缀,-0分
12.字段名称是否存在关键字:每存在1个关键字,扣除1分,权重分5分
参考地址:https://dev.mysql.com/doc/mysqld-version-reference/en/keywords-5-7.html
>=1,-1分
>=2,-2分
>=3,-3分
>=4,-4分
>=5,-5分(全部扣除)
最多-5分,最少-0分
样例:所有字段未存在关键字,-0分
13.是否使用*text数据类型:每使用1大字段数据类型扣除50%权重分,权重分5分
*text数据类型包括:tinytext、text、mediumtext、longtext
>=1,-2.5分
>=2,-5分(全部扣除)
样例:所有字段未存在text字段,-0分
14.类型、状态字段非tinyint数据类型:注释存在 类型 状态 分类的字段非tinyint每1个扣除20%权重分,权重分5分
在所有的字段注释中查找关键字:类型 状态 分类 三个关键字的字段
>=1,-1分
>=2,-2分
>=3,-3分
>=4,-4分
>=5,-5分(全部扣除)
最多-5分,最少-0分
样例:共有7个符合关键字的字段,超过了5个,-5分
re_store_type 调入仓类型
order_type 订单类型
deli_store_type 调出仓类型
movement_type_code 申请原因(移动类型)
order_status 订单状态
design_check_status 设计审核状态
demand_order_status 需求单状态
15.单表字段总数:单表字段总数超过50个,扣除50%权重分,超过60个扣除100%,权重分10分
所有字段个数总数超过50个,开始扣分
>=50%,-5分
>=60%,-10分(全部扣除)
最多-10分,最少-0分
样例:全表共有57个字段,超过50个,未达到60个,-5分
以上计分:
-0-0-10-0-5-5-0-10-10-0-0-0-0-5-5=-50分,最终得分100-50=50分,自动审核不通过,进入人工审核
五.其他原型截图
- 1.同步开发、测试库报错
- 2.发布同步
- 3.数据源配置,在数据源上进行额外的配置
- 4.确认导入开发库的表