Das ORACLE_HOME-Verzeichnis in der Datenbank

15. Juni 2025 0 Von Markus Flechtner

„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)