oracle 集群中全局对象的查询

来源:互联网 发布:安卓平台c语言编译器 编辑:程序博客网 时间:2024/04/28 15:45

最近在写一个监控oracle运行状况的程序,其中对锁事件的监控 遇到了一个麻烦:

      我们的数据库是采用3节点的集群,而数据库锁是存在于某一个具体数据库实例上的数据库对象,这样导致的问题就是只有当我连接到某一实例上,我才能获取该实例上有哪些锁对象及其相关信息。但是我的程序要能获取到集群中全部节点上的锁信息。显然这里是一个矛盾了。       经过一番折腾,最后演进出如下的几个办法,发现采用Oracle内建的gv视图方案是最优的。

 

方案一:多数据源连接

方案:在程序中建立到集群中全部节点的连接,然后遍历,将获取到的结果信息汇总叠加得出最终的全局信息。

缺点:一般而言,一个程序只会建立一个数据库连接,整个程序都依赖于这个数据库链接存取数据。另外操作起来也十分繁琐

方案二:DB_LINK+VIEW

方案:在程序中只建立到具体一个实例的连接,在这个实例上建立到其它实例的db_link,然后将监控写在view中供程序调用

优点:将对多个数据库连接从程序代码中解放出来,拿到了数据库视图中,使程序可以保持一个数据源连接;通用性强

缺点:操作上仍然感觉比较繁琐,而且程序移至时需要修改视图

方案三:使用Oracle内建的gv视图

方案:经过百度得知,Oracle内建了gv视图来支撑集群的全局查询。在单个节点上,我们会使用v$session、v$lock,到了集群环境我们可以在单个节点上使用gv$session、gv$lock

优点:完全符合通常在单个节点上的操作,把集群变成了单个节点。

缺点:由于是Oracle内建特性,因此当更换数据库时需要修改(或许这也不是什么缺点)

 

总结:综上可知,方案三是最优的方案,方案二次之,方案三应该放弃。