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.确认导入开发库的表
posted @ 2021-05-10 20:11  Jenvid  阅读(520)  评论(0编辑  收藏  举报