Olá pessoal,

Espero que estejam bem!

Recentemente um cliente entrou em contato pois estavam com problemas para fazer o rollback de um patch de JDK no $GRID_HOME.

Vamos entender melhor sobre o cenário:

O cliente estava rodando no patch level 19.17 e precisava aplicar o patch 19.19 no seu ambiente. Portanto, antes dele de fato aplicar, ele fez o analyze:

/oracle/app/193/grid/OPatch/opatchauto apply /sapcd/19C/AprilDBPatches/35037840 -analyze

==Following patches FAILED in analysis for apply:

Patch: /sapcd/19C/AprilDBPatches/35037840/35042068
Log: /oracle/app/193/grid/cfgtoollogs/opatchauto/core/opatch/opatch2023-08-03_08-31-44AM_1.log
Reason: Failed during Analysis: CheckConflictAgainstOracleHome Failed, [ Prerequisite Status: FAILED, Prerequisite output:
The details are:
Reason -
Superset Patch 35042068 has
Subset Patch 34419443 which has overlay patches [35004974] and these overlay patches conflict with Superset Patch
Subset Patch 34419443 which has overlay patches [35004974] and these overlay patches conflict with Superset Patch

OPatch recommends any one of the following actions
- Please rebuild the superset patch to make su ...

O cliente abriu um chamado com a Oracle que foi citado o seguinte:

1. Rollback JDK patch 35004974 JDK BUNDLE PATCH 19.0.0.0.230418

2. Apply GI Release Update 35037840 19.19.0.0.0

3. Apply Release Update patch 35042068 DATABASE RELEASE UPDATE 19.19.0.0.0

Há alguns meses, o time de segurança da informação realizou esses scan periódicos por vulnerabilidade e informaram que a versão do binário $GRID_HOME/jdk/bin/java precisava ser atualizada. Desta forma, eles realizaram a instalação do patch 35004974 – JDK BUNDLE PATCH 19.0.0.0.230418.

Para poderem instalar o GI Release Update 19.19, eles precisariam fazer o rollback do patch 35004974 no GRID_HOME. Pois bem, eles tentaram realizar o rollback do patch:

opatch rollback -id 35004974

Após a tentativa do rollback, a seguinte mensagem foi exibida.

[Aug 3, 2023 3:10:13 AM] [INFO]     Command call is : /oracle/app/193/grid/bin/patchgen commit -rb 35004974
[Aug 3, 2023 3:10:13 AM] [INFO]     /oracle/app/193/grid/bin/patchgen: line 138: /oracle/app/193/grid/jdk/bin/java: No such file or directory
[Aug 3, 2023 3:10:13 AM] [SEVERE]   OUI-67073:UtilSession failed: RollbackSession failed in system modification phase... '/oracle/app/193/grid/bin/patchgen: line 138: /oracle/app/193/grid/jdk/bin/java: No such file or directory
                                    '
[Aug 3, 2023 3:10:13 AM] [INFO]     Finishing UtilSession at Thu Aug 03 03:10:13 UTC 2023
[Aug 3, 2023 3:10:13 AM] [INFO]     Log file location: /oracle/app/193/grid/cfgtoollogs/opatch/opatch2023-08-03_03-09-39AM_1.log
[Aug 3, 2023 3:10:13 AM] [INFO]     Stack Description: java.lang.RuntimeException: RollbackSession failed in system modification phase... '/oracle/app/193/grid/bin/patchgen: line 138: /oracle/app/193/grid/jdk/bin/java: No such file or directory
                                    '
                                    	at oracle.opatch.OPatchSession.runPatchgen(OPatchSession.java:932)
                                    	at oracle.opatch.RollbackSession.rollback(RollbackSession.java:1993)
                                    	at oracle.opatch.RollbackSession.autoRollback(RollbackSession.java:903)
                                    	at oracle.opatch.RollbackSession.processLocal(RollbackSession.java:1627)
                                    	at oracle.opatch.RollbackSession.process(RollbackSession.java:2528)
                                    	at oracle.opatch.RollbackSession.process(RollbackSession.java:2639)
                                    	at oracle.opatch.OPatchACL.processRollback(OPatchACL.java:281)
                                    	at oracle.opatch.opatchutil.NRollback.legacy_process(NRollback.java:1048)
                                    	at oracle.opatch.opatchutil.NRollback.process(NRollback.java:242)
                                    	at oracle.opatch.opatchutil.OUSession.nrollback(OUSession.java:1150)
                                    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                                    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                                    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                                    	at java.lang.reflect.Method.invoke(Method.java:498)
                                    	at oracle.opatch.UtilSession.process(UtilSession.java:355)
                                    	at oracle.opatch.OPatchSession.process(OPatchSession.java:2643)
                                    	at oracle.opatch.OPatch.process(OPatch.java:873)
                                    	at oracle.opatch.OPatch.main(OPatch.java:930)
                                    Caused by: java.lang.RuntimeException: RollbackSession failed in system modification phase... '/oracle/app/193/grid/bin/patchgen: line 138: /oracle/app/193/grid/jdk/bin/java: No such file or directory
                                    '
                                    	... 18 more

Observem bem essa mensagem:

RollbackSession failed in system modification phase… ‘/oracle/app/193/grid/bin/patchgen: line 138: /oracle/app/193/grid/jdk/bin/java: No such file or directory

Qual não foi a nossa surpresa ao perceber que após a tentativa de rollback, o conteúdo de $GRID_HOME/jdk foi totalmente removido. O diretório ficou vazio!

Como bons DBAs, nós havíamos feito um backup do $GRID_HOME antes, restauramos apenas o $GRID_HOME/jdk e pudemos seguir com o troubleshooting.

O próximo passo foi ativar o DEBUG do opatch para poder tentar entender o que estava acontecendo. Com o usuário grid:

export OPATCH_DEBUG=true

opatch rollback -id 35004974

OK, vamos analisar o debug (output truncado para facilitar a leitura):

[SystemCall.ExecReturn: systemCommand= ("/oracle/app/193/grid/bin/patchgen commit -rb 35004974"), errMsg= mv: cannot move ‘/oracle/app/193/grid/lib/libasmclntsh19.so’ to ‘/oracle/app/193/grid/lib/libasmclntsh19.so.bak’: Permission denied
make: *** [update_patchrep] Error 1
, normalMsg= 19
loading the appropriate library for linux
patchgensh19.so loaded succesfully.

Note: Successfully commited, created .s file with apply and recover patches
mv -f /oracle/app/193/grid/lib/libasmclntsh19.so /oracle/app/193/grid/lib/libasmclntsh19.so.bak
make libasmclntsh19.so returned code 2
, return code= 99, exec. ok= false]
RollbackSession failed in system modification phase... 'mv: cannot move ‘/oracle/app/193/grid/lib/libasmclntsh19.so’ to ‘/oracle/app/193/grid/lib/libasmclntsh19.so.bak’: Permission denied
make: *** [update_patchrep] Error 1
'
UtilSession failed: RollbackSession failed in system modification phase... 'mv: cannot move ‘/oracle/app/193/grid/lib/libasmclntsh19.so’ to ‘/oracle/app/193/grid/lib/libasmclntsh19.so.bak’: Permission denied
make: *** [update_patchrep] Error 1

Vamos prestar atenção à mensagem:

mv: cannot move ‘/oracle/app/193/grid/lib/libasmclntsh19.so’ to ‘/oracle/app/193/grid/lib/libasmclntsh19.so.bak’: Permission denied

OK, o usuário não teve permissão para mover o arquivo.

Após checar o conteúdo de $GRID_HOME/lib, observei que vários arquivos estavam com o ownership incorreto (essa é uma boa pergunta, como foi alterado? Provavelmente alguém estava com o dedo pesado).

No Linux há uma forma “fácil” de resolver isso caso você tenha um servidor onde as permissões/ownership estejam corretas, o que é o nosso caso.

Vamos salvar todas as permissões/ownership num arquivo. Como root:

cd /oracle/app/193/grid

getfacl -R * >> /sapcd/enkitec/19c/permissions.txt


Isso salvará todas as permissões e ownership dos arquivos e subdiretórios (o -R é para uso recursivo) dentro do arquivo permissions.txt.

Vamos analisar o conteúdo de apenas um trecho do arquivo:

# file: libasmclntsh19.a
# owner: grid
# group: oinstall
user::rw-
group::r--
other::r--

# file: libasmclntsh19.so
# owner: grid
# group: oinstall
user::rwx
group::r-x
other::r-x

Perfeito! Agora vamos ao servidor cujas permissões/ownership precisam ser restauradas, também como root:

cd /oracle/app/193/grid

setfacl -R –restore=/sapcd/enkitec/19c/permissions.txt

Isso vai restaurar, também de forma recursiva, as permissões/ownership dos arquivos.

Agora podemos tentar fazer o rollback novamente. Com o usuário grid:

opatch rollback -id 35004974

Vamos analisar o output do rollback:

Oracle Interim Patch Installer version 12.2.0.1.36
Copyright (c) 2023, Oracle Corporation.  All rights reserved.


Oracle Home       : /oracle/app/193/grid
Central Inventory : /oracle/app/oraInventory
   from           : /oracle/app/193/grid/oraInst.loc
OPatch version    : 12.2.0.1.36
OUI version       : 12.2.0.7.0
Log file location : /oracle/app/193/grid/cfgtoollogs/opatch/opatch2023-08-05_23-00-09PM_1.log


Patches will be rolled back in the following order: 
   35004974
The following patch(es) will be rolled back: 35004974  

Rolling back patch 35004974...
RollbackSession rolling back interim patch '35004974' from OH '/oracle/app/193/grid'

Patching component oracle.jdk, 1.8.0.201.0...
RollbackSession removing interim patch '35004974' from inventory

Log file location: /oracle/app/193/grid/cfgtoollogs/opatch/opatch2023-08-05_23-00-09PM_1.log

OPatch succeeded.

Perfeito!

Espero que tenha sido útil!

Um abraço,

Vinicius