Oracle patchen ohne oraInventory? Geht nicht? Geht doch!

Man benötigt es nicht wirklich oft – aber wenn es defekt ist oder gar komplett fehlt wird das oraInventory auf einen Schlag plötzlich sehr wichtig. Ohne oraInventory kann man das Oracle weder Patchen noch Updaten. Eigentlich sollte es kein Problem sein das Verzeichnis einfach aus einem Backup wieder herzustellen. Eigentlich. Denn manchmal kommt es eben anders als man denkt. Man wollte z.B. nur schnell einen Oracle SBP einspielen und dann meldet der OPatch folgende Fehlermeldung:

OPatch failed to locate Central Inventory.
Possible causes are: 
    The Central Inventory is corrupted
    The oraInst.loc file specified is not valid.
LsInventorySession failed: OPatch failed to locate Central Inventory.
Possible causes are: 
    The Central Inventory is corrupted
    The oraInst.loc file specified is not valid.

Es gibt nun zwei Möglichkeiten:

  • Eine Neuinstallation der kompletten Oracle Software
  • Das orainventory einfach wieder herstellen

(Bitte nicht auf die Idee kommen das Verzeichnis einfach von einer anderen Oracle Installation zu kopieren – das ist keine gute Idee!)
Da mir die erste Lösung zu viel Aufwand mit sich bringt bin ich eher ein Freund des zweiten Lösungsansatzes. Die Umsetzung funktioniert im Übrigen auch viel schneller.

Zunächst identifiziert man wo bei der Installation das oraInventory der eigentlich erwartet wird. Bei SAP Systemen ist das i.d.R. immer /oracle:

[orad01@sapserver ~]$ cat /etc/oraInst.loc
inventory_loc=/oracle/oraInventory
inst_group=dba
[orad01@sapserver ~]$ 

In diesem Falle wäre das korrekte Verzeichnis also:

/oracle/oraInventory

Im Oracle Verzeichnis sieht es dann ggf. so aus:

[orad01@sapserver ~]$ ls -la /oracle
insgesamt 32
drwxr-xr-x.  8 orad01 dba    4096  1. Mai 17:23 .
dr-xr-xr-x. 21 root   root   4096 30. Apr 21:35 ..
drwxr-xr-x.  2 orad01 sapsys 4096  1. Mai 16:51 checkpoints
drwxr-xr-x.  3 root   root   4096  1. Mai 17:24 client
drwxr-xr-x. 18 orad01 dba    4096  1. Mai 19:49 D01
drwxrwxr-x. 11 orad01 sapsys 4096  1. Mai 16:16 diag
drwxrwxr-x.  3 root     1001 4096  1. Mai 15:46 stage
[orad01@sapserver ~]$

Hier fehlt das oraInventory komplett. Möglich wäre auch, dass ein Teil des Verzeichnisses gelöscht wurde. Hier Beispielhaft der komplette Inhalt bei einer frischen Installation:

[orad01@sapserver /oracle]$ find oraInventory
oraInventory
oraInventory/ContentsXML
oraInventory/ContentsXML/comps.xml
oraInventory/ContentsXML/inventory.xml
oraInventory/ContentsXML/libs.xml
oraInventory/oui
oraInventory/oui/srcs.lst
oraInventory/logs
oraInventory/logs/oraInstall2015-05-01_04-41-33PM.out
oraInventory/logs/installActions2015-05-01_04-41-33PM.log
oraInventory/logs/time2015-05-01_04-41-33PM.log
oraInventory/logs/oraInstall2015-05-01_04-41-33PM.err
[orad01@sapserver /oracle]$

Im ORACLE_HOME finden wir dann:

[orad01@sapserver ~]$ ls -al $ORACLE_HOME/oui
insgesamt 60
drwxr-xr-x.  8 orad01 dba 4096  1. Mai 16:48 .
drwxr-xr-x. 75 orad01 dba 4096  1. Mai 16:51 ..
-rwxr-xr-x.  1 orad01 dba  323 17. Feb 2007  admin_langs.xml
drwxr-xr-x.  3 orad01 dba 4096  1. Mai 16:48 bin
-rw-r-----.  1 orad01 dba 6632  1. Mai 16:45 clusterparam.ini
drwxr-xr-x.  2 orad01 dba 4096  1. Mai 16:45 instImages
drwxr-xr-x.  4 orad01 dba 4096  1. Mai 16:45 jlib
drwxr-xr-x.  3 orad01 dba 4096  1. Mai 16:48 lib
-rwxr-xr-x.  1 orad01 dba 2110 17. Feb 2007  nlsrtlmap.xml
-rw-r-----.  1 orad01 dba 6782  1. Mai 16:45 oraparam.ini
drwxr-xr-x.  3 orad01 dba 4096  1. Mai 16:43 prov
-rwxr-xr-x.  1 orad01 dba  748 17. Feb 2007  runtime_langs.xml
drwxr-xr-x.  2 orad01 dba 4096  1. Mai 16:45 schema
[orad01@sapserver ~]$

Über den Oracle Installer im ORACLE_HOME kann man das komplette oraInventory wieder herstellen:

$ORACLE_HOME/oui/bin/runInstaller -silent -attachHome ORACLE_HOME=$ORACLE_HOME ORACLE_HOME_NAME=112_64

Achtung. Ggf. muss ORACLE_HOME_NAME durch eine andere Angabe ersetzt werden, sofern der (typischer weise als symbolischer Link) Ordner nicht vorhanden ist (z.B. 11204, 11203, 11202 etc.)

Die Ausführung sieht dann so aus:

[orad01@sapserver /oracle]$ $ORACLE_HOME/oui/bin/runInstaller -silent -attachHome ORACLE_HOME=$ORACLE_HOME ORACLE_HOME_NAME=112_64
Oracle Universal Installer wird gestartet...

Swap-Speicher wird geprüft: muss größer sein als 500 MB.   Tatsächlich 20479 MB    Erfolgreich
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /oracle/oraInventory
'AttachHome' war erfolgreich.
[orad01@sapserver /oracle]$

Sofern die Aktion erfolgreich war findet sich an der entsprechenden Stelle im Filesystem das vermisste Verzeichnis. Einen kleinen Unterschied zum „Original“ gibt es dann aber doch:

Der Ordner

/oracle/oraInventory/oui/

existiert nicht. Das ist aber nicht weiter schlimm. Nach einer frischen Oracle Installation sieht der Inhalt so aus:

[orad01@sapserver oui]$ ls -al
insgesamt 12
drwxrwx---. 2 orad01 dba 4096  1. Mai 16:43 .
drwxrwx---. 5 orad01 dba 4096  1. Mai 16:48 ..
-rw-rw----. 1 orad01 dba  359  1. Mai 16:43 srcs.lst
[orad01@sapserver oui]$ cat srcs.lst
 < ? xml version="1.0" standalone="yes" ? >
 < !-- Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. - ->
 < !-- Do not modify the contents of this file by hand. - - >
 < SourceConfigs >
 < StagingAreas >
 < StgArea URL="/oracle/stage/112_64/database/install/../stage/products.xml" / >
 < / StagingAreas >
 < ServerConfigs >
 < / ServerConfigs >
 < / SourceConfigs >
 [orad01@sapserver oui]$

Dem O-/MOPATCH ist das jedoch egal. Mit dem Oracle SBP / Update kann jetzt fortgefahren werden. In den gesparten 30 Minuten Aufwand zur Neuinstallation kann man jetzt entspannt einen Kaffee trinken gehen 😉