Wenn man in einem ORACLE_HOME regelmäßig aktuelle Patches einspielt, dauert es von Mal zu Mal länger und der Platzverbrauch im ORACLE_HOME wird immer größer. Das liegt daran, dass OPatch – damit ein Rollback möglich ist – im Verzeichnis $ORACLE_HOME/.patch_storage die alten Versionen der Software aufhebt und ein Patch Inventory File (oui-patch.xml) mit Informationen zu den Patches befüllt.
Seit OPatch Version 26 (12.2.0.1.26) bietet Oracle mit dem OPatch Archive Utility die Möglichkeit, nicht mehr benötigte Patches aus dem Verzeichnis $ORACLE_HOME/.patch_storage zu entfernen. Leider wurde dabei das Patch Inventory nicht ebenfalls gesäubert. Mike Dietrich hat in seinem Blog Binary patching is slow because of the inventory beschrieben, wie man dies selbst manuell machen kann. Leider ist die Methode fehleranfällig, und wenn man nicht aufpasst, ist das Patch Inventory korrupt.
OPatch 12.2.0.1.37 bringt das saubere Löschen von inaktiven Patches
Die aktuelle Version von OPatch – passend zu Oracle 19.19 – hat jetzt zwei neue Optionen:
- listorderedinactivepatches … Anzeigen der inaktiven (= aktuell nicht benötigten) Patches
- deleteinactivepatches … Löschen der inaktiven Patches
$ORACLE_HOME/OPatch/opatch util listorderedinactivepatches
Oracle Interim Patch Installer version 12.2.0.1.37
Copyright (c) 2023, Oracle Corporation. All rights reserved.
Oracle Home : /u01/app/oracle/product/19
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/19/oraInst.loc
OPatch version : 12.2.0.1.37
OUI version : 12.2.0.7.0
Log file location : /u01/app/oracle/product/19/cfgtoollogs/opatch/opatch2023-05-15_21-44-33PM_1.log
Invoking utility "listorderedinactivepatches"
List Inactive patches option provided
The oracle home has the following inactive patch(es) and their respective overlay patches:
-Inactive RU/CPU 32218454, installed on: Wed Jan 20 00:53:50 CET 2021, with overlays: 33197296
-Inactive RU/CPU 32545013, installed on: Wed Apr 21 14:22:28 CEST 2021, with overlays: 33197296
-Inactive RU/CPU 32904851, installed on: Fri Aug 06 21:09:30 CEST 2021, with overlays: 33197296
-Inactive RU/CPU 29517242, installed on: Thu Apr 18 09:21:17 CEST 2019, with no overlays
-Inactive RU/CPU 30557433, installed on: Tue Jan 21 21:13:29 CET 2020, with overlays: 33197296
-Inactive RU/CPU 33192793, installed on: Wed Dec 15 23:04:33 CET 2021, with overlays: 33197296
-Inactive RU/CPU 33515361, installed on: Wed Jan 19 21:37:55 CET 2022, with overlays: 33197296
-Inactive RU/CPU 30869156, installed on: Wed Apr 15 00:10:36 CEST 2020, with overlays: 33197296
-Inactive RU/CPU 31281355, installed on: Wed Jul 15 10:17:40 CEST 2020, with overlays: 33197296
-Inactive RU/CPU 31771877, installed on: Wed Oct 21 11:47:02 CEST 2020, with no overlays
-Inactive RU/CPU 33192694, installed on: Thu Dec 16 00:07:03 CET 2021, with no overlays
-Inactive RU/CPU 33561310, installed on: Wed Jan 19 22:12:28 CET 2022, with no overlays
-Inactive RU/CPU 34086870, installed on: Wed Jul 20 21:11:37 CEST 2022, with no overlays
-Inactive RU/CPU 34411846, installed on: Tue Nov 08 22:35:03 CET 2022, with no overlays
Total: 14 inactive RU/CPU patch(es) and 8 inactive overlay patch(es).
OPatch succeeded.
Hinweis: der Output wurde von einem Artikel von Mike Dietrich übernommen.
Möchte man die inaktiven Patches jetzt löschen, so kann man dies entweder mit manueller Interaktion oder automatisch (Option -silent) durchführen. Je nachdem, wie viele Patches zu Löschen sind, prüft deleteinactivepatches zuerst was zu tun ist – dies kann locker 15-60 Minuten dauern – bis dann die Frage „Do you want to proceed? [y|n]“ kommt, die man mit „y“ beantworten muss. Um sich diese Wartezeit zu ersparen, kann man gerne die „-silent“ Option nutzen. Die Laufzeit wird dadurch nicht kürzer, man muss nur nicht auf die Frage warten, um diese zu beantworten.
$ORACLE_HOME/OPatch/opatch util deleteinactivepatches -silent
Defaultmäßig wird der aktuellste inaktive Patch nicht gelöscht. Dies kann man über die Konfigurationsdatei $ORACLE_HOME/OPatch/config/opatch.properties anpassen.
OPATCH_HEAP_MEMORY=3072
PS_OBFUSCATION=true
RETAIN_INACTIVE_PATCHES=1
Der Parameter RETAIN_INACTIVE_PATCHES gibt an, wie viele inaktive Patches man für OPatch Rollback behalten möchte. Der Default von einem Patch ist sinnvoll. Sollte man in der neuen Version in einen neuen BUG laufen, kann man damit schnell und einfach zurück steigen. Ist man mit dem aktuellen Patchstand zufrieden, kann man auch alle inaktiven Patches löschen, indem man RETAIN_INACTIVE_PATCHES auf 0 setzt. Ich würde das aber nicht empfehlen.
Leider gibt es aktuell noch einige bekannte Probleme, so werden nicht immer alle inaktiven Patches korrekt gelöscht – sprich es bleiben manchmal einige übrig. Der Workaround ist, den Aufruf von OPatch deleteinactivepatches zu wiederholen.
Referenzen
- Mike Dietrich: Cleaning up older patch artifacts – improving opatch performance
- MOS Note 2942102.1 – OPatch 12.2.0.1.37+ Introduces a New Feature to Delete Inactive Patches in the ORACLE_HOME/.patch_storage Directory