zoukankan      html  css  js  c++  java
  • 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.确认导入开发库的表
  • 相关阅读:
    orcal中创建和删除表空间和用户
    tomcat常用的优化和配置
    tomcat中如何禁止和允许主机或地址访问
    velocity生成静态页面代码
    java下载文件
    java上传文件
    数据库行列转换
    JDBC连接数据库详解
    java中插入myslq的datetime类型的
    简单的邮件发送mail.jar
  • 原文地址:https://www.cnblogs.com/jenvid/p/14780386.html
Copyright © 2011-2022 走看看