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 oracleoraInventory
(/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.