Database 如何获得Oracle数据库中两种状态之间的差异?

Database 如何获得Oracle数据库中两种状态之间的差异?,database,oracle,diff,Database,Oracle,Diff,我正在寻找一种方法来获得数据库(Oracle)中两种状态(S1、S2)的差异,以比较并查看这两种状态之间的变化。最好是看看我必须对状态1(S1)中的数据库应用哪些语句才能将其转换为状态2(S2) 这两个状态来自同一个数据库(模式),在不同的时间点(一些少量的时间,而不是几周) 我在考虑做一些类似快照和比较的事情,但是如何制作快照以及如何以最佳方式比较它们呢 编辑:我正在寻找数据的变化(主要是)和可能的对象。这是一个很容易陈述的问题,似乎解决方案也应该同样简单。唉,事实并非如此 起点是数据字典。从

我正在寻找一种方法来获得数据库(Oracle)中两种状态(S1、S2)的差异,以比较并查看这两种状态之间的变化。最好是看看我必须对状态1(S1)中的数据库应用哪些语句才能将其转换为状态2(S2)

这两个状态来自同一个数据库(模式),在不同的时间点(一些少量的时间,而不是几周)

我在考虑做一些类似快照和比较的事情,但是如何制作快照以及如何以最佳方式比较它们呢


编辑:我正在寻找数据的变化(主要是)和可能的对象。

这是一个很容易陈述的问题,似乎解决方案也应该同样简单。唉,事实并非如此

起点是数据字典。从所有_表中,您可以生成一组如下语句:

select * from t1@dbstate2
minus
select * from t1@dbstate1
这将为您提供在dbstate2中添加或修改的行集。您还需要:

select * from t1@dbstate1
minus
select * from t1@dbstate2
这将为您提供在dbstate2中删除或修改的行集。显然,修改后的行将包含在第一组中,这是您需要的增量,它给出了删除的行

但这并不是那么简单,因为:

  • 表具有代理主键(由序列填充)时 那么同一记录的主键可能具有不同的值 在每个数据库中。因此,您应该将这些主键从 集合,这意味着您需要为每个集合生成定制的投影 表中使用了所有的选项卡列和所有约束,并且您可能必须使用 您的技能和判断,以确定哪些查询需要排除 主键
  • 此外,解析外键也有问题。如果外键是 代理密钥(或者即使不是)您需要查找 用于比较中的含义/说明列的参考表 两个数据库。但当然,参考数据可能有不同的含义 两个数据库中的状态,因此必须首先解决该问题
一旦您有了一组识别差异的查询,您就可以 准备好进入下一阶段:生成appliance语句。那里 这里有两种选择:生成一组INSERT、UPDATE和DELETE 语句或生成一组合并语句。合并具有 幂等性的优点,但这是一个很难生成的东西。可能 选择更简单的选项

记住:

  • 对于INSERT和UPDATE语句,排除由触发器填充或生成的列(标识、虚拟列)
  • 对于INSERT和UPDATE语句,您需要连接到引用表,以便根据描述列填充外键(除非您已经同步了所有外键表的主键列)
  • 因此,这意味着您需要按照外键依赖项指定的顺序应用更改
  • 对于DELETE语句,您需要级联外键删除 <> LI>可以考虑删除外键和其他约束,但是当您重新应用它们时,您可能处于一个正确的泡菜中,从而发现您有约束违反。李>
  • 使用DML错误日志记录跟踪批量操作中的错误 如果您还需要管理模式对象的更改?哦,孩子。在开始执行数据比较任务之前,需要先对齐数据结构。这比内容简单,因为它只需要查询数据字典并生成DDL语句。即使如此,您仍需要对所有_表(甚至可能是所有_对象)运行
    减号
    查询,以查看是否有表添加到目标数据库或从目标数据库中删除。对于两者中都存在的表,您需要查询所有的\u TAB\u col以验证列-名称、数据类型、长度和精度,可能也是必需的

    仅仅同步模式结构就足够复杂,Oracle将此功能作为企业版许可证的额外收费出售


    所以,坦白说。以上是一个思维实验。我从来没有这样做过。我怀疑是否有人这样做过。除了最微不足道的模式外,生成DML以同步状态的所有模式都是一项艰巨的工作,可能需要数月的时间才能完成(在此期间,两个数据库的状态继续发生分歧)

    简单的解决方案?对于一次性练习,数据泵从S2导出,数据泵使用
    表\u exists\u action=REPLACE
    选项导入S1

    对于持续的数据同步,Oracle提供了多种复制解决方案。他们推荐的方法是,但这是一个单独许可的产品,所以他们当然推荐:)12c中不推荐使用Streams进行复制,但它仍然存在


    同步架构结构的解决方案就是不需要它:将所有DDL脚本存储在源代码管理存储库中,并始终从那里部署。

    您是否在寻找数据、对象(如新列)或数据库配置(v$parameter等)的差异?@JonHeller:我主要是寻找数据中的更改,但是如果可能的话,对象(列)也会很好。