Das ORACLE_HOME-Verzeichnis in der Datenbank
„Wie kann ich in der Datenbank ermitteln, wie mein ORACLE_HOME-Verzeichnis ist?“; mit dieser Frage konfrontierte mich letztens ein Kollege. Da gibt es doch ein passendes Directory-Object in der Datenbank, oder?
Und die Antwort: Ja, aber …
Schauen wir doch mal …
[oracle@abel ~]$ echo $ORACLE_HOME
/opt/oracle/product/19.27-ee
[oracle@abel ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Jun 15 17:39:14 2025
Version 19.27.0.0.0
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.0.0
SQL> column directory_name format a20
SQL> column directory_path format a40
SQL> select directory_name,directory_path from dba_directories
2 where directory_name='ORACLE_HOME';
DIRECTORY_NAME DIRECTORY_PATH
-------------- ---------------------------
ORACLE_HOME /opt/oracle/product/19.24-ee
Die Datenbank wurde mit 19.24-er Software angelegt und das ORACLE_HOME-Directory zeigt auf das damalige Oracle Home-Verzeichnis.
Wie kann man das nun korrigieren?
Dazu gibt es im $ORACLE_HOME/admin-Verzeichnis das Skript utlfixdirs.sql.
Das Skript korrigiert das ORACLE_HOME-Directory in der Datenbank und ggf. auch das ORACLE_BASE-Directory.
Genauer: das Skript prüft, ob es Directory-Objekte gibt, die das ORACLE_HOME oder ORACLE_BASE enthalten und korrigiert diese. Wenn man also in einer PDB eigene Directory-Objekte angelegt hat, die auf eines der beiden Verzeichnisse referenzieren, dann sollte man das Skript erst in der PDB ausführen. Ansonsten reicht es, das Skript in der CDB$ROOT auszuführen:
[oracle@abel ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Jun 15 17:47:19 2025
Version 19.27.0.0.0
Copyright (c) 1982, 2024, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.0.0
SQL> @?/rdbms/admin/utlfixdirs.sql
Container: CDB$ROOT
Current ORACLE_HOME: /opt/oracle/product/19.27-ee
Original ORACLE_HOME: /opt/oracle/product/19.24-ee
DBMS_OPTIM_ADMINDIR
…OLD: /opt/oracle/product/19.24-ee/rdbms/admin
…NEW: /opt/oracle/product/19.27-ee/rdbms/admin
DBMS_OPTIM_LOGDIR
…OLD: /opt/oracle/product/19.24-ee/cfgtoollogs
…NEW: /opt/oracle/product/19.27-ee/cfgtoollogs
ORACLE_HOME
…OLD: /opt/oracle/product/19.24-ee
…NEW: /opt/oracle/product/19.27-ee
SDO_DIR_ADMIN
…OLD: /opt/oracle/product/19.24-ee/md/admin
…NEW: /opt/oracle/product/19.27-ee/md/admin
XMLDIR
…OLD: /opt/oracle/product/19.24-ee/rdbms/xml
…NEW: /opt/oracle/product/19.27-ee/rdbms/xml
XSDDIR
…OLD: /opt/oracle/product/19.24-ee/rdbms/xml/schema
…NEW: /opt/oracle/product/19.27-ee/rdbms/xml/schema
PL/SQL procedure successfully completed.
SQL> column directory_name format a20
SQL> column directory_path format a40
SQL> select con_id,directory_name,directory_path from cdb_directories
2 where directory_name='ORACLE_HOME';
CON_ID DIRECTORY_NAME DIRECTORY_PATH
----- ------------------ --------------------------
1 ORACLE_HOME /opt/oracle/product/19.27-ee
3 ORACLE_HOME /opt/oracle/product/19.27-ee
2 ORACLE_HOME /opt/oracle/product/19.27-ee
Und damit ist dann auch in allen Containern die Verzeichnis-Welt wieder in Ordnung. Für mich gehört das utlfixdirs.sql-Skript jetzt zu Post-Patch-Aktivitäten.
Referenzen
- MOS-Note: Database Contains Directory Objects „ORACLE_BASE“ And „ORACLE_HOME“ With DIRECTORY_PATH = „/“ (Doc ID 2582103.1)