如何以编程方式查找当前的Oracle补丁集?

时间:2014-01-20 13:32:10

标签: sql oracle versioning data-dictionary

Identifying Your Oracle Database Software Release Oracle声明您可以通过查询PRODUCT_COMPONENT_VERSION找到“特定于平台的版本号”(补丁集):

  

要确定当前安装的Oracle数据库的版本并查看您正在使用的其他数据库组件的发行版级别,请查询数据字典视图PRODUCT_COMPONENT_VERSION。

据此我们使用的是11.2.0.3.0

SQL> select * from product_component_version;

PRODUCT                             VERSION         STATUS
----------------------------------- --------------- ---------------
NLSRTL                              11.2.0.3.0      Production
Oracle Database 11g                 11.2.0.3.0      64bit Production
PL/SQL                              11.2.0.3.0      Production
TNS for Linux:                      11.2.0.3.0      Production

V $ VERSION也是如此(PRODUCT_COMPONENT_VERSION是偶然的视图):

SQL> select * from v$version;

BANNER
---------------------------------------------------------

Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

然而,根据DBA_REGISTRY_HISTORY,数据库似乎在11.2.0.3.5 1

SQL> select action, namespace, version, id, comments from dba_registry_history;

ACTION          NAMESPACE VERSION            ID COMMENTS
--------------- --------- ---------- ---------- ------------------------------
VIEW INVALIDATE                         8289601 view invalidation
UPGRADE         SERVER    11.2.0.3.0            Upgraded from 11.2.0.1.0
APPLY           SERVER    11.2.0.3            0 Patchset 11.2.0.2.0
APPLY           SERVER    11.2.0.3            5 PSU 11.2.0.3.5

DBA_REGISTRY_HISTORY不一定有任何数据,因此我无法可靠地使用此视图。并且,Oracle似乎没有提供填充注释字段的标准化方法,我似乎还在做以下操作,然后祈祷它有效。

select max(regexp_replace(comments, '[^[:digit:].]')) 
         keep (dense_rank first order by action_time desc)
  from dba_registry_history

是否有一种更简单,更可靠的方法来查找当前版本,包括以编程方式设置补丁集?

<子> 1。也有可能:我完全误读了这个,人们已经忘记了他们修补的内容。

2 个答案:

答案 0 :(得分:3)

由于我无法保证DBA_REGISTRY_HISTORY将被填充,即使它似乎来提供正确的补丁集我最终还是会在没有任何内容的情况下从V $ VERSION填充以下内容。

with drh as ( 
select max(regexp_replace(comments, '[^[:digit:].]')) 
            keep (dense_rank last order by action_time) as vers
  from dba_registry_history
       )
 , v$v as ( 
select regexp_substr(banner, '(\d+\.?){5}', 1) as vers
  from v$version 
 where lower(banner) like 'oracle%'
       )
select coalesce(drh.vers, v$v.vers) as patch_set
  from drh
 right outer join v$v
   on 1 = 1

这是有效的,因为两个查询只返回一行,我在10.2,11.2和12.1上测试了它

然而,这是荒谬和丑陋的。由于所有内容都是自由文本字段,Oracle无法保证它不会中断,Oracle似乎偶尔也会更改这些视图中显示数据的方式。此外,Oracle在这些视图中甚至不一致。这是一个12c数据库,注意注释字段在升级时神奇地恢复补丁集,以及版本和注释不匹配。

SQL> select action, version, id, comments from dba_registry_history;

ACTION          VERSION          ID COMMENTS
--------------- ---------- -------- ------------------------
APPLY           11.2.0.3          0 Patchset 11.2.0.2.0
APPLY           11.2.0.3          0 Patchset 11.2.0.2.0
APPLY           11.2.0.3          5 PSU 11.2.0.3.5
VIEW INVALIDATE             8289601 view invalidation
UPGRADE         12.1.0.1.0          Upgraded from 11.2.0.3.0
APPLY           12.1.0.1          0 Patchset 12.1.0.0.0

6 rows selected.

所以,如果这些数据以易于使用的方式公开,那仍然很好。

答案 1 :(得分:-1)

- 使用sqlplus列出应用的补丁

SET linesize 200 pagesize 200
col action_time FOR a28
col version FOR a10
col comments FOR a35
col action FOR a25
col namespace FOR a12
SELECT * FROM registry$history;

- 使用opatch列出应用的补丁

$ ORACLE_HOME / OPatch / opatch lsinventory

$ ORACLE_HOME / OPatch / opatch lsinventory | grep&#34;补丁说明&#34;

$ ORACLE_HOME / OPatch / opatch lsinventory -details