Skip to Main Content

Breadcrumb

Opatch Archive Utility

Wenn man regelmäßig die Critical Patch Updates (CPUs) einspielt, wächst das ORACLE_HOME stetig an. Der Grund ist, dass Opatch alle Dateien, die modifiziert oder ersetzt werden, für das Rollback des Patches aufheben muss. Opatch, legt dafür entsprechende Archive unter $ORACLE_HOME/.patch_storage an. Wenn   Oracle Grid Infrastruktur zum Einsatz kommt und für das Patching opatchauto genutzt wird, gibt es zusätzlich ein Verzeichnis $ORACLE_HOME/.opatchauto_storage.

ls $ORACLE_HOME/.patch_storage
29517242_Apr_17_2019_23_27_10      29585399_Apr_9_2019_19_12_47     29774421_Jun_11_2019_04_07_14     
29834717_Jul_10_2019_02_09_26      31771877_Oct_7_2020_21_34_19     32067171_Dec_2_2020_09_24_57
32218454_Jan_14_2021_16_24_38      32399816_Mar_9_2021_06_16_02     32545013_Apr_16_2021_07_40_05
33192694_Sep_14_2021_16_48_27      33192793_Oct_15_2021_07_09_52    33515361_Jan_13_2022_06_14_07
33529556_Jan_9_2022_21_15_36       33561310_Jan_5_2022_08_13_10     interim_inventory.txt
LatestOPatchSession.properties     NApply                           newdirs.txt
record_inventory.txt

Wie viel Platz wird dabei belegt?

du -sh $ORACLE_HOME/.patch_storage
12G /u01/app/oracle/product/19.0.0/dbhome_ee/.patch_storage

Da kommen pro CPU schon mal 1-2GB zusammen, und mit der Zeit belegen die alten Dateien deutlich mehr Platz als das aktuelle ORACLE_HOME.

Die Idee, dieses Verzeichnis einfach zu löschen, kann beim Einspielen des nächsten Patches zu Problemen führen. Wenn ein Patch einen anderen ersetzt, kann es sein, dass zuerst ein Rollback erfolgt - dazu werden die Files in $ORACLE_HOME/.patch_storage benötigt - hier ein Beispiel, wie das aussehen kann:

Rollback von Interimpatch "32902635" aus OH "/u01/app/oracle/product/19.0.0/dbhome_ee" wird durchgeführt
Patching von Komponente oracle.rdbms, 19.0.0.0.0...
RollbackSession Interimpatch '32902635' wird aus Bestand entfernt

Sofern kein Rollback nötig ist, legt opatch einfach ein neues Verzeichnis an. Trotzdem ist es empfehlenswert, die nicht mehr benötigten Patch-Archive sauber zu beseitigen. In einem Blog zu Thema schreibt Mike Dietrich "Don’t wipe it out!"

Bei Oracle gibt es in diesem Zusammenhang einen Enhancement Request  31138227 – $OH/.PATCH_STORAGE KEEP N-1 VERSIONS ONLY FOR BETTER SPACE CONSUMPTION. Auf Grund dieses Requests hat Oracle beginnend mit Opatch Version 26 (zB: 12.2.0.1.26) die Option archive utility eingeführt.

opatch util archive -help
Oracle Interim Patch-Installationsprogramm Version 12.2.0.1.28
…
OPTIONS
      -patches
             A comma separated list of patches to be given for
             archive.

      -archive_dir
             Specify custom storage path to store the patches
             which are going to be archived.
…

Damit ein Rollback möglich ist, sollte  keine Patches gelöscht werden, die seit dem letzten - nicht dem aktuellen - Critical Patch Update eingespielt wurden. Auch der letzte CPU sollte aufgehoben werden.

Wie findet man entsprechende Kandidaten zum archivieren?

Eine Liste aller aktuell nicht mehr benötigten Patches lässt sich finden mittels

opatch lsinv -inactive

allerdings kann die sehr lange werden. Um einen Überblick zu bekommen, können   die Patch descriptions heraus gefiltert werden.

$ opatch lsinv -inactive | grep description
ARU platform description:: Linux x86-64
Patch description:  "Database Release Update : 19.13.0.0.211019 (33192793)"
Patch description:  "OJVM RELEASE UPDATE: 19.13.0.0.211019 (33192694)"
Patch description:  "Database Release Update : 19.11.0.0.210420 (32545013)"
Patch description:  "OJVM RELEASE UPDATE: 19.11.0.0.210420 (32399816)"
Patch description:  "Database Release Update : 19.10.0.0.210119 (32218454)"
Patch description:  "OJVM RELEASE UPDATE: 19.10.0.0.210119 (32067171)"
Patch description:  "Database Release Update : 19.9.0.0.201020 (31771877)"
Patch description:  "OJVM RELEASE UPDATE: 19.4.0.0.190716 (29774421)"
Patch description:  "Database Release Update : 19.4.0.0.190716 (29834717)"
Patch description:  "OCW RELEASE UPDATE 19.3.0.0.0 (29585399)"
Patch description:  "Database Release Update : 19.3.0.0.190416 (29517242)"

Der letzte nicht mehr benötigte CPU  ist der vom Oct 2021 (19.13) - der sollte für ein Rollback vorgehalten werden.

opatch util archive -patches 32545013,32399816,32218454,32067171,31771877,29774421,29834717,29585399,29517242 \
       -archive_dir /u02/app/stage/19c/opatch_archive
…
Invoking utility "archive"

Archiving Patch - 31771877 ....
Sucessfully archived patch - 31771877 in /u02/app/stage/19c/opatch_archive/31771877_Oct_7_2020_21_34_19.zip
…
Succesfully verified the created archive. Deleting the original patch from  - 
/u01/app/oracle/product/19.0.0/dbhome_ee/.patch_storage/31771877_Oct_7_2020_21_34_19
…
Patch archive operation completed successfully.

Wie viel Platz benötigt der $ORACLE_HOME/.patch_storage jetzt?

du -sh $ORACLE_HOME/.patch_storage
4,6G /u01/app/oracle/product/19.0.0/dbhome_ee/.patch_storage

Wie viel Platz belegt das OPatch Archive jetzt?

du -sh /u02/app/stage/19c/opatch_archive
2,9G /u02/app/stage/19c/opatch_archive

Spannend ist, dass $ORACLE_HOME/.patch_storage von 12GB auf 4,6GB verkleinert wurde, im Archiv aber nur 2,9GB belegt sind. Der Grund dafür ist, dass Oracle die Verzeichnisse im Archiv zipped.

ls /u02/app/stage/19c/opatch_archive
29517242_Apr_17_2019_23_27_10.zip  29834717_Jul_10_2019_02_09_26.zip  32218454_Jan_14_2021_16_24_38.zip
29585399_Apr_9_2019_19_12_47.zip   31771877_Oct_7_2020_21_34_19.zip   32399816_Mar_9_2021_06_16_02.zip
29774421_Jun_11_2019_04_07_14.zip  32067171_Dec_2_2020_09_24_57.zip   32545013_Apr_16_2021_07_40_05.zip

Versucht man einen archivierten Patch zurück zu rollen (Rollback), kommt  folgender Fehler

opatch rollback -id 31771877

...
Patches will be rolled back in the following order:
  31771877
Prerequisite check "CheckRollbackable" failed.
Possible causes are:
The patch can not be rolled back
No read or write permission to ORACLE_HOME/.patch _storage
The ORACLE_HOME/.patch_storage file may have been removed.
The details are:
***************************************************
Following patches are archived:
31771877
Please follow the instructions below to unarchive the patches before proceeding with current Opatch operation 
(as /u01/app/oracle/product/19.0.0/dbhome_ee owner).
Step 1: opatch util unarchive -patches 31771877
Step 2 : Resume/Rerun current Opatch operation: opatch rollback -id 31771877 -invPtrLoc /u01/app/oracle/product/19.0.0/dbhome_ee/oraInst.loc

Wird  einer der Patches doch noch benötigt, kann er  auch aus dem Archive geholt werden:

opatch util unarchive -patches 32545013,32399816

Bekannte Probleme bei der Nutzung von opatch archive utility

  • Keine Leerzeichen bei der Angabe der Patches in der Liste (also nicht 32545013, 32399816 sondern wirklich 32545013,32399816), sonst kommt der Error Code 14.
  • Ist im Archive Verzeichnis nicht ausreichend Platz, kommt Error Code 73.