Installer un mini-patch Oracle 10.2.0.4 avec opatch (oraInventory)

Logo

Introduction

La vie d’une instance Oracle pour une version donnée n’est pas exempte de bugs spécifiques à Oracle. Un DBA oracle est toujours amené à "patcher" un serveur Oracle.

Lorsqu’il s’agit d’un "mini-patch" pour une version donnée, le patch est appliqué non pas avec Oracle OUI (Oracle Universal Installer) mais avec le binaire opatch et bien des écueils peuvent être rencontrés. En voici quelques uns et comment les résoudre.

Dans tous les cas de figure, il faut bien conserver les répertoires oraInventory créés avec Oracle Universal Installer pour appliquer des mini patch avec opatch !

L’article présente l’application du mini-patch Bundle 3 sur une version 10.2.0.4 Sun Solaris AMD 64 bits.

Contexte de l’application du mini patch

Avec la version 10.2.0.4 d’Oracle, à intervalles très fréquents, des fichiers de trace sont générés dans le répertoire user_dump_dest, fichiers de trace qui génèrent des alertes lorsque le monitoring est mis en place et qui peuvent au bout d’un certain temps saturer le système de fichiers supportant le répertoire des fichiers de trace (/Software/oracle dans cet article). Pour retrouver le chemin physique du répertoire user_dump_dest :

select name, value from v$parameter where name='user_dump_dest'

NAME              VALUE
----------------- ------------------------------
user_dump_dest    /Software/oracle/Instances/RISKD/udump

Le paramètre user_dump_dest est défini dans le fichier d’initialisation de l’instance.

Les fichiers de trace remontent des informations avec les mots clé kdl_trim / newlen :

…
*** SESSION ID:(7.1694) 2010-03-26 13:13:01.084
[kdl_trim]: newlen: 49983
…

La note Oracle Metalink 7612639.8 relate ce bug :

Bug:6972843 Unnecessary trace files with "[kdl_trim]: newlen" text in them

Ce bug est corrigé par le mini patch #3 pour la version 10.2.0.4 (Patch:7612639) qu’il suffit de télécharger depuis metalink.oracle.com pour la plateforme concernée. Les mini patch sont au format .zip.

Un mini patch n’est pas systématiquement disponible pour une plateforme donnée : le mini patch #4 10.2.0.4 par exemple n’est pas disponible pour Solaris X86 64 bits. Le bug peut dépendre de la plateforme.

opatch

Téléchargement et préparation du mini-patch

Le mini patch 10204_Solaris86-64_bundled_3.zip est téléchargé puis transféré avec ftp (mode binaire) vers la machine X86 contenant la distribution Oracle à patcher dans le répertoire /Software/oracle/10204bundle3.

oracle@SRVUNXFR2 > cd ~
oracle@SRVUNXFR2 > cd 10204bundle3
oracle@SRVUNXFR2 > unzip 10204_Solaris86-64_bundled_3.zip

La commande unzip créé un nouveau répertoire xxxxxxxx contenant le mini-patch à appliquer. Dans ce cas pratique, le répertorire 7612639 est créé, répertoire qui contient le fichier README.txt du mini-patch et les patch à appliquer. Un mini patch Oracle est cumulatif : le mini-patch #3 de la version 10.2.0.4 contient également les mini patch #1 et #2 de la version 10.2.0.4.

Le binaire opatch et l’option lsinventory

Le binaire opatch applique les mini patch sur des distributions Oracle lorsqu’il ne s’agit pas d’un patch OUI (Oracle Universal Installer). opatch est localisé dans le répertoire $ORACLE_HOME/OPatch (/Software/oracle/app/product/10.2.0.4/OPatch dans le contexte de cet article).

L’utilisation du binaire opatch impose de mettre à jour dans sa session Unix la variable d’environnement $PATH pour référencer le répertoire $ORACLE_HOME/OPatch :

oracle@SRVUNXFR2 > export PATH=$ORACLE_HOME/OPatch:$PATH

Après mise à jour de la variable $PATH, le binaire opatch est appelé en étant positionné dans le répertoire contenant le mini patch (/Software/oracle/10204bundle3/7612639).

oracle@SRVUNXFR2 > cd 7612639

oracle@SRVUNXFR2 > opatch lsinventory

Dans un premier temps, seule l’option lsinventory est donnée au binaire opatch pour vérifier la conformité de l’environnement et notamment les informations de l’installation contenues dans le répertoire oraInventory créé par Oracle Universal Installer. L’inventaire contenu dans le répertoire oraInventory permet à Oracle de retrouver les produits installés pour une distribution Oracle donnée.

Le répertoire oraInventory n’est pas présent (erreur 73)

Lorsque le répertoire oraInventory n’est pas trouvé, opatch lsinventory remonte des informations de corruption avec le code erreur 73 :

oracle@SOPT2ORA > opatch lsinventory 

Invoking OPatch 10.2.0.4.2

Oracle Interim Patch Installer version 10.2.0.4.2
Copyright (c) 2007, Oracle Corporation.  All rights reserved.


Oracle Home       : /Software/oracle/app/product/10.2.0
Central Inventory : /Software/oracle/oraInventory
   from           : /var/opt/oracle/oraInst.loc
OPatch version    : 10.2.0.4.2
OUI version       : 10.2.0.4.0
OUI location      : /Software/oracle/app/product/10.2.0/oui
Log file location : /Software/oracle/app/product/10.2.0/cfgtoollogs/opatch/opatch2010-03-26_17-28-51PM.log

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.

OPatch failed with error code 73

opatch recherche le répertoire d’inventaire oraInventory grâce au fichier /var/opt/oracle/oraInst.loc, fichier créé dans le script $ORACLE_HOME/root.sh exécuté avec le compte root lors de l’installation avec Oracle Universal Installer (OUI) de la version 10.2.0.4.

À partir de cette étape, si le répertoire oraInventory n’a pas été conservé, il n’y pas d’autre alternative que de refaire une installation 10.2.0.4 sur une machine vierge avec Oracle Universal Installer. Dans le contexte de cet article, le répertoire /Software/oracle/oraInventory a été heureusement conservé sur une autre machine qui a servi à construire la version 10.2.0.4.

Le fichier oraInst.loc n’est pas présent (erreur 104)

Lorsque la commande opatch lsinventory ne retrouve pas le fichier /var/opt/oracle/oraInst.loc, l’erreur 104 est remontée.

oracle@SOPT2ORA > opatch lsinventory 

Invoking OPatch 10.2.0.4.2
Oracle Interim Patch Installer version 10.2.0.4.2
Copyright (c) 2007, Oracle Corporation.  All rights reserved.


Oracle Home       : /Software/oracle/app/product/10.2.0
Central Inventory : n/a
   from           : 
OPatch version    : 10.2.0.4.2
OUI version       : 10.2.0.4.0
OUI location      : /Software/oracle/app/product/10.2.0/oui
Log file location : n/a

OPatch cannot find a valid oraInst.loc file to locate Central Inventory.

OPatch failed with error code 104

Le fichier oraInst.loc est obligatoire pour utiliser opatch, il peut être créé manuellement avec le compte root si il n’existe pas. Il s’agit d’un simple fichier texte à créer dans le répertoire mentionné par opatch lsinventory (/var/opt/oracle) et contient 2 entrées pour une simple distribution oracle (sans Oracle RAC - Real Application Clusters, etc.) :

  • inventory_loc : chemin complet du répertoire de l’inventaire oracle oraInventory (/Software/oracle/oraInventory).
  • inst_group : le groupe Unix à laquelle appartient le compte oracle (dba).
/var/opt/oracle/oraInst.loc
inventory_loc=/Software/oracle/oraInventory
inst_group=dba

Le répertoire oraInventory est présent mais la variable HOME NAME n’est pas conforme dans le fichier inventory.xml

Même lorsque le répertoire /Software/oracle/oraInventory et le fichier /var/opt/oracle/oraInst.loc sont présents, opatch lsinventory peut encore soulever des erreurs :

oracle@SOPT2ORA > opatch lsinventory 

Invoking OPatch 10.2.0.4.2

Oracle Interim Patch Installer version 10.2.0.4.2
Copyright (c) 2007, Oracle Corporation.  All rights reserved.


Oracle Home       : /Software/oracle/app/product/10.2.0
Central Inventory : /Software/oracle/oraInventory
   from           : /var/opt/oracle/oraInst.loc
OPatch version    : 10.2.0.4.2
OUI version       : 10.2.0.4.0
OUI location      : /Software/oracle/app/product/10.2.0/oui
Log file location : /Software/oracle/app/product/10.2.0/cfgtoollogs/opatch/opatch2010-03-26_16-22-34PM.log

List of Homes on this system:

  Home name= OraDb10g_home1, Location= "/Software/oracle/app/product/10.2.0.1"
Inventory load failed... OPatch cannot load inventory for the given Oracle Home.
Possible causes are:
   Oracle Home dir. path does not exist in Central Inventory
   Oracle Home is a symbolic link
   Oracle Home inventory is corrupted
LsInventorySession failed: OracleHomeInventory gets null oracleHomeInfo

OPatch failed with error code 73

opatch lsinventory détecte maintenant que la variable Home name n’est pas conforme, variable qui est lue dans le fichier /Software/oracle/oraInventory/ContentsXML/inventory.xml :

grep 'HOME NAME' inventory.xml<HOME NAME="OraDb10g_home1" LOC="/Software/oracle/app/product/10.2.0.1" TYPE="O" IDX="1"/>

Pour adresser ce problème, le fichier inventory.xml peut être édité manuellement pour refléter l’installation Oracle courante (/Software/oracle/app/product/10.2.0.4 dans cet article) :

<HOME NAME="OraDb10g_home1" LOC="/Software/oracle/app/product/10.2.0.4" TYPE="O" IDX="1"/>

opatch lsinventory dans un environnement conforme

Lorsque l’environnement est enfin conforme, opatch lsinventory remonte les caractéristiques de la distribution Oracle 10g R2 avec l’information OPatch succeeded :

oracle@SOPT2ORA > opatch lsinventory 

Invoking OPatch 10.2.0.4.2

Oracle Interim Patch Installer version 10.2.0.4.2
Copyright (c) 2007, Oracle Corporation.  All rights reserved.


Oracle Home       : /Software/oracle/app/product/10.2.0
Central Inventory : /Software/oracle/oraInventory
   from           : /var/opt/oracle/oraInst.loc
OPatch version    : 10.2.0.4.2
OUI version       : 10.2.0.4.0
OUI location      : /Software/oracle/app/product/10.2.0/oui
Log file location : /Software/oracle/app/product/10.2.0/cfgtoollogs/opatch/opatch2010-03-28_18-12-58PM.log

Lsinventory Output file location : /Software/oracle/app/product/10.2.0/cfgtoollogs/opatch/lsinv/lsinventory2010-03-28_18-12-58PM.txt

--------------------------------------------------------------------------------
Installed Top-level Products (2): 

Oracle Database 10g                                                  10.2.0.1.0
Oracle Database 10g Release 2 Patch Set 3                            10.2.0.4.0
There are 2 products installed in this Oracle Home.


There are no Interim patches installed in this Oracle Home.


--------------------------------------------------------------------------------

OPatch succeeded.

opatch détecte 2 produits installés : la version 10.2.0.1 et la version 10.2.0.4 (Release 2 Patch Set 3 10.2.0.4).

Le message "There are no Interim patches installed in this Oracle Home" signifie qu’aucun mini patch (Interim release) a été installé depuis sur la version 10.2.0.4.

Application du patch : opatch napply

Lorsque la commande opatch lsinventory précise que l’environnement est conforme, le mini-patch peut alors être appliqué sur l’environnement. Pour cela, le binaire opatch est lancé avec l’option napply depuis le répertoire contenant le mini patch (/Software/oracle/10204bundle3/7612639). Le menu est interactif.

oracle@SOPT2ORA > opatch napply -skip_subset -skip_duplicate

Invoking OPatch 10.2.0.4.2

Oracle Interim Patch Installer version 10.2.0.4.2
Copyright (c) 2007, Oracle Corporation.  All rights reserved.

UTIL session

Oracle Home       : /Software/oracle/app/product/10.2.0
Central Inventory : /Software/oracle/oraInventory
   from           : /var/opt/oracle/oraInst.loc
OPatch version    : 10.2.0.4.2
OUI version       : 10.2.0.4.0
OUI location      : /Software/oracle/app/product/10.2.0/oui
Log file location : /Software/oracle/app/product/10.2.0/cfgtoollogs/opatch/opatch2010-03-28_18-28-00PM.log

Invoking utility "napply"
Checking conflict among patches...
Checking if Oracle Home has components required by patches...
Checking skip_duplicate
Checking skip_subset
Checking conflicts against Oracle Home...
OPatch continues with these patches:    5868257   6327692   6455659   6678845   6972843   7008262   7123643   7189447   7272297   7278117   7612639   7691766

Do you want to proceed? [y|n]

Oracle demande la confirmation de l’installation du patch.

User Responded with: Y

Running prerequisite checks...

OPatch detected non-cluster Oracle Home from the inventory and will patch the local system only.


Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = '/Software/oracle/app/product/10.2.0')


Is the local system ready for patching? [y|n]

À cette étape, toutes les instances et tous les listeners Oracle utilisant la distribution à patcher doivent être éteints (shutdown immediate, etc.). opatch détecte bien par ailleurs qu’il s’agit d’un environnement Oracle local simple sans cluster RAC (OPatch detected non-cluster Oracle Home from the inventory and will patch the local system only).

L’application du mini patch démarre dès que l’utilisateur répond oui (y). Un extrait de l’application du patch est donné ci-dessous :

Backing up files affected by the patch 'NApply' for restore. This might take a while...

Applying patch 7008262...

ApplySession applying interim patch '7008262' to OH '/Software/oracle/app/product/10.2.0'
Backing up files affected by the patch '7008262' for rollback. This might take a while...

Patching component oracle.rdbms, 10.2.0.4.0...
Updating archive file "/Software/oracle/app/product/10.2.0/lib/libserver10.a"  with "lib/libserver10.a/kxto.o"
ApplySession adding interim patch '7008262' to inventory

 ...
Files check OK: Files from Patch ID 7691766 are present in Oracle Home.
Running make for target ioracle
Running make for target client_sharedlib

The local system has been patched and can be restarted.

UtilSession: N-Apply done.

OPatch succeeded.

L’application du mini patch est un succès et terminé dès qu’apparaît le message "OPatch succeeded". Les instances et les listener utilisant la distribution Oracle qui vient d’être patchée peuvent alors être redémarrés. Le message "Backing up files affected by the patch '7008262' for rollback" est plutôt rassurant, il signifie qu’une sauvegarde des librairies et exécutables est réalisée avec opatch en cas de retour arrière.

Visualiser les patchs installés

Si la commande opatch lsinventory est exécutée à nouveau, les différents mini patchs installés avec les numéros de bugs correpondants sont listés dans la section "Interim patches" :

oracle@SOPT2ORA > opatch lsinventory

Invoking OPatch 10.2.0.4.2

Oracle Interim Patch Installer version 10.2.0.4.2
Copyright (c) 2007, Oracle Corporation.  All rights reserved.


Oracle Home       : /Software/oracle/app/product/10.2.0
Central Inventory : /Software/oracle/oraInventory
   from           : /var/opt/oracle/oraInst.loc
OPatch version    : 10.2.0.4.2
OUI version       : 10.2.0.4.0
OUI location      : /Software/oracle/app/product/10.2.0/oui
Log file location : /Software/oracle/app/product/10.2.0/cfgtoollogs/opatch/opatch2010-03-28_18-12-58PM.log

Lsinventory Output file location : /Software/oracle/app/product/10.2.0/cfgtoollogs/opatch/lsinv/lsinventory2010-03-28_18-12-58PM.txt

--------------------------------------------------------------------------------
Installed Top-level Products (2): 

Oracle Database 10g                                                  10.2.0.1.0
Oracle Database 10g Release 2 Patch Set 3                            10.2.0.4.0
There are 2 products installed in this Oracle Home.


Interim patches (12) :

Patch  7691766      : applied on Sun Mar 28 18:31:11 MEST 2010
   Created on 24 Mar 2009, 23:14:53 hrs PST8PDT
   Bugs fixed:
     7691766, 7385253, 6870047

Patch  7612639      : applied on Sun Mar 28 18:30:51 MEST 2010
   Created on 8 Jan 2009, 21:26:08 hrs PST8PDT
   Bugs fixed:
     7612639
 ...

--------------------------------------------------------------------------------

OPatch succeeded.

Faire retour arrière sur l’application d’un patch : opatch nrollback

Durant l’application du mini patch 10.2.0.4 #3 réalisée précédemment, un fichier est créé dans le répertoire $ORACLE_HOME/rdbms/admin, fichier texte qui liste simplement les numéros de patch installés. Le nom du fichier est donné dans le fichier README.txt du mini patch #3 et permet éventuellement de désinstaller le patch "bundle" grâce à l’option nrollback du binaire opatch :

opatch nrollback -idFile $ORACLE_HOME/rdbms/admin/gen10204003_rollback_all.lst

Le fichier gen10204003_rollback_all.lst est très basique :

$ORACLE_HOME/rdbms/admin/gen10204003_rollback_all.lst
5868257,6327692,6455659,7123643,7278117,6678845,6972843,7008262,7189447,7272297,769
1766,7612639

Conclusion

Conserver précieusement le répertoire d’inventaire oraInventory créé par Oracle Universal Installer. Beaucoup de temps et d’énergie seront économisés.