当前位置:首页 > 技术知识 > 正文内容

【Oracle】同实例中两个不同 owner 的表字段进行比较

maynowei19小时前技术知识2

文中使用的Oracle版本为10g。

本次介绍的脚本主要用于对同实例中的两个相同的表进行字段的差异比对。听起来很奇怪吧,这都是因为以前开发过程不规范导致的,不然不应该会出现这么荒唐的脚本才对。我说几个关键字估计大家都能够猜想到了,“联合开发”、“异地沟通”、“交叉开发”、“时间紧迫”、“在线排Bug”、“紧急修复”......

在这个脚本出来的时候,我个人还不知道Navicat这款软件(毕竟那时候还是小小的程序员没有想那么多,只着眼解决眼前的问题)不然直接用表结构对比就解决了。有一天线上出现问题,经排查发现上线时执行的数据库脚本存在问题,线上数据库与仿真数据库存在大量表结构差异。

一下子晴天霹雳,这无疑是重大事故。项目经理首当其冲领了盒饭(被辞退),之后就要考虑怎样修复问题。我那时候的提议被采纳了并且修复了这个问题。

以下操作在DBA和项目负责人陪同下一同完成:

  1. 找到一个干净的环境,将上线前一天晚上备份的dmp文件进行了还原(注意这里只还原了表结构);
  2. 再将现生产上的所有表进行表结构的备份,在同一个环境下还原;
  3. 之后根据以下脚本对表结构进行对比
select a.TABLE_NAME,
a.COLUMN_NAME as  acol, 
b.COLUMN_NAME as bcol, 
a.DATA_TYPE as adt,
a.DATA_LENGTH as adl,
b.DATA_TYPE as bdt,
b.DATA_LENGTH as bdl
from (
  (select a.TABLE_NAME,
     a.COLUMN_NAME,
     a.DATA_TYPE,
     a.DATA_LENGTH
     from DBA_TAB_COLUMNS a
     where a.OWNER = '<owner1>' 
     and a.TABLE_NAME='<table_name>'
    ) a 
  left join 
  (select a.TABLE_NAME,
     a.COLUMN_NAME,
     a.DATA_TYPE,
     a.DATA_LENGTH
     from DBA_TAB_COLUMNS a
     where a.OWNER = '<owner2>' 
     and a.TABLE_NAME='<table_name>'
    ) b 
  on a.COLUMN_NAME = b.COLUMN_NAME)

这个脚本能够定位到被修改过的字段和差异部分内容。

  1. 将差异内容导出来后让开发人员自行确认,并整理好修复脚本;

还好,这次事故修改的只是字段,若是触发器或者存储过程就麻烦了。
虽然整个修复过程只耗费了半小时,但是再一次让我觉得这个规范这个东西是很有必要的,很多时候项目为了快裁剪了很多东西后面要补的时候特别费劲。

相关文章

Flutter 之 ListView(flutter框架)

在 Flutter 中,ListView 可以沿一个方向(垂直或水平方向)来排列其所有子 Widget,常被用于需要展示一组连续视图元素的场景ListView 构造方法ListView:仅适用于列表中...

Android指示器,轮播与循环轮播(android轮播图代码)

Android UI Libs之CircleIndicator1. 说明CircleIndicator,顾名思义,圆形指示器,只一个可以用来做轮播的第三方库。2. 配置在模块的build.gradle...

CPU「离奇」飙到 100%!开发者挖出 Linux 内核 16 年老 Bug:这么多年竟无人发现?

【CSDN 编者按】每一次对旧设备的升级都仿佛是一场跨越时代的冒险。本文作者致力于将基于 PXA166 的 Chumby 8 设备从 Linux 2.6.28 版本升级到现代 6.x 版本,然而,在看...

C++并发同步核心-mutex深度解析:守护共享数据的关键

在多线程编程中,当多个线程需要访问和修改共享数据时,如果没有任何同步机制,就可能发生数据竞争(Data Race),导致程序行为不可预测、数据损坏甚至崩溃。C++标准库通过<mutex>头...

从 async/await 到虚拟线程:Python 并发的再思考

演进之路:从async/await到线程的反思首先必须明确的是,async/await对Python并非全无裨益:它最大的价值,是让更多人接触到了并发编程。通过在编程语言中嵌入语法元素,并发编程的门槛...

Linux系统编程:条件变量为什么要用锁

条件变量可以解决线程同步和共享资源访问的问题,条件变量是对互斥锁的补充,它允许一个线程阻塞并等待另一个线程发送的信号,当收到信号时,阻塞的线程被唤醒并试图锁定与之相关的互斥锁。具体定义如下:等待:in...