Database 如何获得Oracle数据库中两种状态之间的差异?
我正在寻找一种方法来获得数据库(Oracle)中两种状态(S1、S2)的差异,以比较并查看这两种状态之间的变化。最好是看看我必须对状态1(S1)中的数据库应用哪些语句才能将其转换为状态2(S2) 这两个状态来自同一个数据库(模式),在不同的时间点(一些少量的时间,而不是几周) 我在考虑做一些类似快照和比较的事情,但是如何制作快照以及如何以最佳方式比较它们呢Database 如何获得Oracle数据库中两种状态之间的差异?,database,oracle,diff,Database,Oracle,Diff,我正在寻找一种方法来获得数据库(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中删除或修改的行集。显然,修改后的行将包含在第一组中,这是您需要的增量,它给出了删除的行
但这并不是那么简单,因为:
- 表具有代理主键(由序列填充)时 那么同一记录的主键可能具有不同的值 在每个数据库中。因此,您应该将这些主键从 集合,这意味着您需要为每个集合生成定制的投影 表中使用了所有的选项卡列和所有约束,并且您可能必须使用 您的技能和判断,以确定哪些查询需要排除 主键
- 此外,解析外键也有问题。如果外键是 代理密钥(或者即使不是)您需要查找 用于比较中的含义/说明列的参考表 两个数据库。但当然,参考数据可能有不同的含义 两个数据库中的状态,因此必须首先解决该问题
减号查询,以查看是否有表添加到目标数据库或从目标数据库中删除。对于两者中都存在的表,您需要查询所有的\u TAB\u col以验证列-名称、数据类型、长度和精度,可能也是必需的
仅仅同步模式结构就足够复杂,Oracle将此功能作为企业版许可证的额外收费出售
所以,坦白说。以上是一个思维实验。我从来没有这样做过。我怀疑是否有人这样做过。除了最微不足道的模式外,生成DML以同步状态的所有模式都是一项艰巨的工作,可能需要数月的时间才能完成(在此期间,两个数据库的状态继续发生分歧)
简单的解决方案?对于一次性练习,数据泵从S2导出,数据泵使用表\u exists\u action=REPLACE
选项导入S1
对于持续的数据同步,Oracle提供了多种复制解决方案。他们推荐的方法是,但这是一个单独许可的产品,所以他们当然推荐:)12c中不推荐使用Streams进行复制,但它仍然存在
同步架构结构的解决方案就是不需要它:将所有DDL脚本存储在源代码管理存储库中,并始终从那里部署。您是否在寻找数据、对象(如新列)或数据库配置(v$parameter等)的差异?@JonHeller:我主要是寻找数据中的更改,但是如果可能的话,对象(列)也会很好。