2017年2月9日

[Database] DBMS_QOPATCH does not work in PDBs (right now)

原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/dbms_qopatch_does_not_work

以下のエントリにコメントをくれたMurthyと、最終的にER(Enhancement Request)になったSR(Service Request)を起票してくれたSimCorpのJeannette Hollandに感謝します。
How to find out if a PSU has been applied? DBMS_QOPATCH
https://blogs.oracle.com/UPGRADE/entry/dbms_qopatch_datapatch_and_other

DBMS_QOPATCH in Multitenant

DBMS_QOPATCHはCDB$ROOT内で実行した場合に限り、インストール済みのパッチに関する有用な情報を取得できます。このデザインはOracle Database 12.1のセキュリティ上の理由によるものです。PDBにインストールされたパッチを確認する必要がある場合にも情報を取得することができます。

Testcase

JannetteのSRからテストケースを拝借しました。
SQL> COLUMN NAME FORMAT A8
SQL>
SQL> SELECT NAME, CON_ID, DBID, CON_UID, GUID FROM V$CONTAINERS ORDER BY CON_ID;

NAME     CON_ID DBID       CON_UID    GUID
-------- ------ ---------- ---------- ------------------
CDB$ROOT      1 3424772713 1          47C8525C0DFE49...
PDB$SEED      2 3983775695 3983775695 E6204BB1F6EB4F...
MYPDB1        3 7270044002 7270044002 B975668B860049...
MYPDB2        4 1943363979 1943363979 BCD7AAFAF3F641...
PDBで実行してみると……
ALTER SESSION SET container = myPDB;

Session altered.

SQL>  select * from OPATCH_XML_INV ;
ERROR:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
KUP-04080: directory object OPATCH_LOG_DIR not found


no rows selected

SQL> select dbms_qopatch.get_opatch_install_info from dual;
ERROR:
ORA-20001: Latest xml inventory is not loaded into table
ORA-06512: at "SYS.DBMS_QOPATCH", line 1986
ORA-06512: at "SYS.DBMS_QOPATCH", line 133
CDBで実行してみると……
SQL> ALTER SESSION SET container = cdb$root;

Session altered.

SQL>  select * from OPATCH_XML_INV ;

XML_INVENTORY
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<InventoryInstance>


SQL> select dbms_qopatch.get_opatch_install_info from dual;

GET_OPATCH_INSTALL_INFO
--------------------------------------------------------------------------------
<oracleHome><UId>OracleHome-2d1c0910-36ac-429b-98db-96a353d423b6</UId><targetTyp

Solution

Oracle Database 12.1.0.2の場合、現時点で有効な解決策はありません。また、この挙動はドキュメントに記載されていないようです。結果として起票されたSRがEnhancement Requestとなりました。Oracle Database 12.1.0.2のPDBでは、以下の回避策がお役に立つかもしれませんが、DBMSのパッケージを呼び出すAPIを使うため、面倒でしかも簡単ではありません。
select patch_id, patch_uid, version, action, action_time, status, description from dba_registry_sqlpatch;
Oracle Database 12.2.0.1でテストしたところ、期待通りに動作してくれました。
SQL> create pluggable database PDB3 admin user adm identified by adm file_name_convert=( '/u02/oradata/CDB2/pdbseed', '/u02/oradata/CDB2/pdb3');

Pluggable database created.

SQL> alter pluggable database pdb3 open;

Pluggable database altered.

SQL> alter session set container=pdb3;

Session altered.

SQL> select dbms_qopatch.get_opatch_install_info from dual; 

GET_OPATCH_INSTALL_INFO
--------------------------------------------------------------------------------
<oracleHome><UId>OracleHome-3cb04a3a-3999-4767-86f1-bc845cab158e</UId><targetTyp

SQL>   select * from OPATCH_XML_INV ;

XML_INVENTORY
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>         <Inv
entoryInstance> <ora

SQL> select xmltransform(dbms_qopatch.get_opatch_lsinventory, dbms_qopatch.get_opatch_xslt) from dual;

XMLTRANSFORM(DBMS_QOPATCH.GET_OPATCH_LSINVENTORY,DBMS_QOPATCH.GET_OPATCH_XSLT)
--------------------------------------------------------------------------------

Oracle Querayable Patch Interface 1.0
-----------------------------------------


SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB3                           READ WRITE NO

0 件のコメント:

コメントを投稿