Oracle has released the first Database Proactive Bundle Patch (12.2.0.1.170516) on May 16th 2017 for Oracle database 12.2. Unfortunately, I could not successfully apply the patch to my lab environment. It would patch CDB$ROOT and PDB$SEED but failed patching my PDB (see lines 34 to 36).
$ ./datapatch -verbose SQL Patching tool version 12.2.0.1.0 Production on Sat May 20 22:49:57 2017 Copyright (c) 2012, 2017, Oracle. All rights reserved. Log file for this invocation: /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_4836_2017_05_20_22_49_57/sqlpatch_invocation.log Connecting to database...OK Note: Datapatch will only apply or rollback SQL fixes for PDBs that are in an open state, no patches will be applied to closed PDBs. Please refer to Note: Datapatch: Database 12c Post Patch SQL Automation (Doc ID 1585822.1) Bootstrapping registry and package to current versions...done Determining current state...done Current state of SQL patches: Bundle series DBBP: ID 170516 in the binary registry and not installed in any PDB Adding patches to installation queue and performing prereq checks... Installation queue: For the following PDBs: CDB$ROOT PDB$SEED PDBDEV1 Nothing to roll back The following patches will be applied: 25862693 (DATABASE BUNDLE PATCH 12.2.0.1.170516) Installing patches... Patch installation complete. Total patches installed: 3 Validating logfiles... Patch 25862693 apply (pdb CDB$ROOT): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/25862693/21259009/25862693_apply_DEV1_CDBROOT_2017May20_22_50_22.log (no errors) Patch 25862693 apply (pdb PDB$SEED): SUCCESS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/25862693/21259009/25862693_apply_DEV1_PDBSEED_2017May20_22_50_47.log (no errors) Patch 25862693 apply (pdb PDBDEV1): WITH ERRORS logfile: /u01/app/oracle/cfgtoollogs/sqlpatch/25862693/21259009/25862693_apply_DEV1_PDBDEV1_2017May20_22_50_47.log (errors) Error at line 32: ORA-65254: invalid path specified for the directory Please refer to MOS Note 1609718.1 and/or the invocation log /u01/app/oracle/cfgtoollogs/sqlpatch/sqlpatch_4836_2017_05_20_22_49_57/sqlpatch_invocation.log for information on how to resolve the above errors. SQL Patching tool complete on Sat May 20 22:51:10 2017
Checking the logfile it showed that a call to “dbms_sqlpatch.patch_initialize” had failed. Looking at what might have caused this error in the procedure I found this:
DIRECTORY_SQL := 'CREATE DIRECTORY dbms_sqlpatch_dir AS ' || DBMS_ASSERT.ENQUOTE_LITERAL(ORACLE_HOME || '/rdbms/admin'); DEBUG_PUT_LINE('directory sql: ' || DIRECTORY_SQL); EXECUTE IMMEDIATE DIRECTORY_SQL;
Why would that fail? The code should actually work. After some further investigation I noticed a sneaky little behavior change in Oracle 12.2. If you create a PDB with the “PATH_PREFIX” clause “CREATE DIRECTORY” will no longer accept absolute path names in that PDB.
SQL> alter session set container=pdbdev1; Session altered. SQL> create or replace directory testdir AS '/u02/oradata/DEV1/PDBDEV1/dump'; create or replace directory testdir AS '/u02/oradata/DEV1/PDBDEV1/dump' * ERROR at line 1: ORA-65254: invalid path specified for the directory SQL> create or replace directory testdir AS './dump'; Directory created. SQL> select directory_path from dba_directories where directory_name = 'TESTDIR'; DIRECTORY_PATH -------------------------------------------------------------------------------- /u02/oradata/DEV1/PDBDEV1/./dump SQL> create or replace directory testdir AS 'dump'; Directory created. SQL> select directory_path from dba_directories where directory_name = 'TESTDIR'; DIRECTORY_PATH -------------------------------------------------------------------------------- /u02/oradata/DEV1/PDBDEV1/dump
Oracle 12.2 will basically accept any string that doesn’t start with a forward-slash “/” and append it to the PATH_PREFIX. This behavior does not reflect the current documentation:
Oracle 12.1, on the other hand, will accept just any string. But as you can see only the first directory object ends up with the inteded directory path.
SQL> create or replace directory testdir AS '/u02/oradata/DEV1/PDB1'; Directory created. SQL> select directory_path from dba_directories where directory_name = 'TESTDIR'; DIRECTORY_PATH -------------------------------------------------------------------------------- /u02/oradata/DEV1/PDB1 SQL> create or replace directory testdir AS './dump'; Directory created. SQL> select directory_path from dba_directories where directory_name = 'TESTDIR'; DIRECTORY_PATH -------------------------------------------------------------------------------- ./dump SQL> create or replace directory testdir AS 'dump'; Directory created. SQL> select directory_path from dba_directories where directory_name = 'TESTDIR'; DIRECTORY_PATH -------------------------------------------------------------------------------- dump
I believe the intention of Oracle was to restrict the directory object path to “PATH_PREFIX” and subfolders in 12.2. They just did it in a very bad way. I’m going to raise a Service Request to see if that’s expected behavior or a regression and will keep you posted in the comment section of this post. Either way, Oracle will have to fix one or the other.