暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB 快速对比测试库与生产库表结构差异

原创 由迪 2023-10-18
104

原作者:戴秋龙

  • 背景
  • 问题概述
  • 解决方案
  • 步骤
    • 1.测试环境生成模型元数据
    • 2.现场(远程)元数据入库
    • 3.验证字段类型不统一
    • 4.验证缺失字段
    • 5.验证缺失表
    • 6.通过差异对比生成差异拉起脚本
  • 参考文档

背景

业务应用上线前尝试“灰度发布”。 经过一系列封板,发包。在调试时出现异常,开发经过排查发现是测试库和现场(远程)库表结构不一致导致的异常。测试库中导出该表后补发现场。但是遇到同样的异常。 核对后发现数张关键表字段不一致。

问题概述

难点:整库近4000张表,核对的工作量较大。现场(远程)经过半年多的升级,升级脚本记录难以溯源。也不知道哪些脚本错升,漏升。如何保障现场表结构和测试环境一致, 顺利完成“灰度发布”。

解决方案

方案1
从半年多的发包的脚本中整理出脚本,分析出脚本执行顺序,核对脚本内容判断出漏执行的脚本,拉起表结构。
缺点:脚本是属于半结构化数据,半结构化数据对比难度较大。无法预估完成时间。
方案2
从模型元数据下手,转换成结构化数据。 对比结构化数据完成表模型对比
image.png

步骤

1.测试环境生成模型元数据

create table  current_tab_columns
as  
select   c.relname tab_name ,  
pn.nspname  tab_schema,   
 td.description  tab_desc, 
 a.attname tab_cloumn, 
SUBSTRING( format_type ( a.atttypid, a.atttypmod ) FROM '.*' )  AS  cloumn_type, 
d.description  cloumn_desc
from   pg_class c
inner join   pg_catalog.pg_namespace pn  on   c.relnamespace  = pn.oid
inner join   pg_catalog.pg_authid  onr  on  onr.oid = c.relowner 
left    join   pg_catalog.pg_description td  on   td.objoid = c.oid  and td.objsubid =0 
left   join    pg_catalog.pg_attribute   a  on  a.attnum >0  and  a.attrelid = c.oid 
left   join    pg_description d     on  d.objoid = a.attrelid  and d.objsubid = a.attnum
left   join    pg_type t    on  a.atttypid = t.oid
where  c.relkind  in ('r', 'v', 'm', 'p')
 and  pn.nspname  not   in ('power_sch_bak', 'power_tech_datatrans' ,'pg_catalog' , 'public','information_schema')   
order by  pn.nspname,  c.relname,   a.attnum ; 

2.现场(远程)元数据入库

现场配合把元数据导出execl文件,结合kettle导入到数据库中。
image.png

3.验证字段类型不统一

with taba as (
select   home_tab.tab_schema,  home_tab.tab_name, home_tab.tab_cloumn  , home_tab.cloumn_type  ,
hn_tab.tab_schema  htab_schema,  hn_tab.tab_name htab_name, hn_tab.tab_cloumn   htab_cloumn, hn_tab.cloumn_type hcloumn_type
from  current_tab   home_tab 
left join    hn_tab   
  on  home_tab.tab_name  =  hn_tab.tab_name  and  home_tab.tab_schema = hn_tab.tab_schema  
	and  home_tab.tab_cloumn = hn_tab.tab_cloumn    
	order by    home_tab.tab_schema,  home_tab.tab_name, home_tab.tab_cloumn
)  select * from  taba where   htab_name  is not null   and   htab_cloumn is not null   and   cloumn_type != hcloumn_type;

image.png
图中可以看到同一张表的字段类型不一致。

4.验证缺失字段

with nottab as   
 (
  select  distinct   home_tab.tab_schema,  home_tab.tab_name from  current_tab home_tab  
  where  (home_tab.tab_schema , tab_name)  not in  ( select       tab_schema,   tab_name from  hn_tab )
)
 , clm_chk_tab  as ( 
 select   distinct   home_tab.tab_schema,  home_tab.tab_name   from  current_tab home_tab  
 where  (home_tab.tab_schema , tab_name, tab_cloumn)  not in  ( select       tab_schema,   tab_name, tab_cloumn from  hn_tab )--- 家里多的字段去掉
 and (home_tab.tab_schema , tab_name) not in ( select  tab_schema,  tab_name from  nottab)  
 )    
select   home_tab.tab_schema,  home_tab.tab_name, home_tab.tab_cloumn  , home_tab.cloumn_type  ,
hn_tab.tab_schema  htab_schema,  hn_tab.tab_name htab_name, hn_tab.tab_cloumn   htab_cloumn, hn_tab.cloumn_type hcloumn_type
from  current_tab   home_tab 
left join    hn_tab   
  on  home_tab.tab_name  =  hn_tab.tab_name  and  home_tab.tab_schema = hn_tab.tab_schema  
	and  home_tab.tab_cloumn = hn_tab.tab_cloumn  
where   (home_tab.tab_schema , home_tab.tab_name) in ( select   tab_schema,  tab_name from  clm_chk_tab ) 
---- and  hn_tab.tab_cloumn is null 
order by    home_tab.tab_schema,  home_tab.tab_name, home_tab.tab_cloumn

image.png
其中对于不上的字段,就是缺少的字段

5.验证缺失表

  select  distinct   home_tab.tab_schema,  home_tab.tab_name from  current_tab home_tab  
 where  (home_tab.tab_schema , tab_name)  not in  ( select       tab_schema,   tab_name from  hn_tab )
 order by 1,2

6.通过差异对比生成差异拉起脚本

核对SQl对比出的差异,生成相应的差异拉起脚本.

参考文档

表结构查询

表结构差异对比

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论