2014-01-20 2 views
5

В Identifying Your Oracle Database Software Release Oracle утверждает, что вы можете найти свой «для конкретной платформы номер версии» (патч набор), запрашивая PRODUCT_COMPONENT_VERSION:Как можно программно найти текущий набор патчей Oracle?

Чтобы определить выпуск Oracle Database, который в настоящее время установлен и увидеть уровни высвобождения другие компоненты базы данных, которые вы используете, запросите представление словаря данных 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 :

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

Интересно - баннер, показанный при входе в систему с SQL/Plus, и каждый отдельный вид или таблица в моей базе данных возвращает 0 для последней части номера версии *, за исключением * dba_registry_history. http://oracle-dba-yi.blogspot.de/2011/04/how-to-find-database-related-version.html утверждает, что «Последующие кумулятивные установки патчей-наборов ... не всегда будут отображаться в баннер ". и впоследствии рекомендует выбирать из dba_registry_history, так что, по-видимому, это путь. Также обратите внимание, что столбец идентификатора идентичен версии патча, но я понятия не имел, насколько это надежно. –

ответ

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 не согласуется с этими представлениями. Вот база данных 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. 

Таким образом, было бы неплохо, если бы эти данные были раскрыты таким образом, который прост в использовании.

+0

Поскольку у вас есть 12c, вы можете взглянуть на [DBMS_QOPATCH] (http://docs.oracle.com/cd/E16655_01/appdev.121/e17602/d_qopatch.htm#ARPLS74834). –

+0

Я также заметил, что пакеты патчей Windows не отображаются на баннере, а не в реестре_истории. И чтобы просто указать очевидное, они появляются в командной строке 'opatch lspatches'. Поэтому ['select extract (sys.DBMS_QOPATCH.GET_OPATCH_LIST, '// patchDescription | // applyDate | // patchID) из double;'] (http://docs.oracle.com/database/121/ARPLS/d_qopatch. htm # ARPLS74834) работал для меня. – eckes

-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 " Патч-описание "

$ ORACLE_HOME/OPatch/opatch lsinventory -details

+0

'DBA_REGISTRY_HISTORY' - это прямой выбор из' REGISTRY $ HISTORY' без изменений, поэтому все, что это делает, это заставить людей войти в систему как SYS без всякой причины ... он даст одинаковые результаты в моем ответе. – Ben

+0

Я знаю об этом @ pooh06, я не понимаю, как вы решаете проблему, о которой я уже доказал, что вы предлагаете, не работает в вопросе ... – Ben

+0

Я добавил это для полноты , DBA_REGISTRY_HISTORY - это представление и SYS.REGISTRY $ ИСТОРИЯ - это таблица. Я предпочитаю использовать представление, потому что его легко запомнить и более удобно. Насколько я знаю, нормальному пользователю в любом случае нужны некоторые привилегии для выбора из словаря данных. Важно то, что мы никогда не должны пытаться модифицировать эти метаданные. В противном случае мы могли бы сломать БД и лицензию на поддержку Oracle. – pooh06

Смежные вопросы