在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。也有可能:我完全误读了这个,人们已经忘记了他们修补的内容。
答案 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