Opatchauto – conflito com outro patch, e agora?

Olá DBAs, a vida tá boa? Vamos ao assuntinho desse post, que acredito vá interessar a nós meros mortais que seguimos (quando possível) o planejamento de aplicar os quarter patches nos nossos clientes 🙂

Lembram do meu último post?

Bem, continuamos a saga com esses patches! Dessa vez temos outro caso onde o mesmo foi diagnosticado, endereçado e corrigido. Especificamente para este Patch Set Update 12.1.0.2.220719 Patch estou enfrentando conflitos com one-off patch em algumas das bases como a seguir:

Analysis for applying patches has failed:
Host: linux-valdz
SIDB Home:/OH12/oracle/prod/12.1.0.2
Version:12.1.0.2.0
Analysis for patches has failed.

==Following patches FAILED in analysis for apply:

Patch: <patch_location>/34057742
Log: /OH12/oracle/prod/12.1.0.2/cfgtoollogs/opatchauto/core/opatch/opatch2025-03-15_09-09-57AM_1.log
Reason: Failed during Analysis: CheckConflictAgainstOracleHome Failed, [ Prerequisite Status: FAILED, Prerequisite output:
Summary of Conflict Analysis:

Patches that can be applied now without any conflicts are :
32758932

Following patches have conflicts. Please contact Oracle Support and get the merged patch of the patches :
21131203, 34057742

Whole composite patch Conflicts/Supersets are:

Composite Patch : 34057742

        Conflict with 21131203

A Mensagem de erro é clara, pedindo para entrar em contat com a Oracle solicitando um merged patch. Não preciso nem dizer o quão moroso pode ser isso:

– Abrir Service Request

– Esperar o primeiro contato

– Responder a um zilhão de questões

– Voltar provavelmente a algumas questões que já fizeram e tão fazendo de novo

– Receber análise com possível solução

O procedimento acima é muito conhecido por nós DBAs, e neste meu caso específico, como não era produção (estamos aplicando nos lower environments primeiro) seria ainda mais moroso, mais lento, mais chato!

Decidi então dar uma pesquisada no que poderia ser feito. Eu poderia fazer rollback do patch 21131203 para aplicar o novo que preciso, mas nesse ponto surgiram duvidas do tipo:

– “Se eu fizer rollback, conseguirei aplica-lo novamente?”

– “Eu preciso dos files do patch para fazer o rollback?”

– “Será que o bug deste one-off patch já foi corrigido neste patch que estou aplicando?”.

Algumas das questões podem parecer básicas ou simples, mas pelo menos da minha parte, patches não são algo que aplico todo dia, aí toda vez que vou fazer me deparo com algumas duvidas devido a situações novas.

Inicialmente, para as perguntas acima, minhas respostas eram respectivamente “Não”, “Sim” e “Não”.

Após me aprofundar mais sobre o assunto, elas mudaram para “Talvez”, “Não” e “Não”.

Se eu fizer rollback, conseguirei aplica-lo novamente?

Não, não será possível aplicar o one-off patch novamente (afinal ele entra em conflito com o PSU aplicado) a não ser que haja um novo específico para o mesmo problema. Caso haja a resposta é Sim.

Eu preciso dos files do patch para fazer o rollback?

Não, os arquivos do one-off patch não são necessários para que eu possa fazer rollback do mesmo. Na verdade nenhum patch precisa dos arquivos para que o rollback seja executado. Se voce olhar a documentação, verá que para executar um rollback é necessário o seguinte comando:

$ opatch rollback -id <patch number>

Bom, fiquei em dúvida sobre como ele consegue fazer o rollback sem ter os arquivos originais, e tive a oportunidade e o privilégio de buscar na fonte, conversando com o grande amigo e conhecido de todos nós aqui, o PM da Oracle Rodrigo Jorge (https://www.dbarj.com.br/en/) que foi super esclarecedor:

– Quando vc instala um patch, os arquivos de aplicar e voltar ficam no Oracle Home, então vc não precisa mais dos arquivos do patch, voce basicamente roda o comando opatch com rollback pra remover do binário, pois dentro do ORACLE_HOME da pasta .patch_storage ele guarda os arquivos que tinham antes do patch ser instalado e que foram substituídos por ele. Então o comando de rollback volta esses arquivos.

Jorge, Rodrigo – 2025

Sacaram pequenos padawans? Não precisa da pasta do patch, pois o controle dele fica no .patch_storage, e vale a ressalva que o Rodrigo Jorge me fez durante nossa conversa:

– Agora se vc limar essa pasta pra salvar espaço, aí já era “parxeiro”!!!

Jorge, Rodrigo – 2025 (falando como um bom carioca)

Pois é, então tenha a preocupação de saber se voce talvez um dia em algum momento irá precisar fazer rollback, antes de apagar a pasta .patch_storage para salvar espaço no seu servidor. Sei que não é comum, mas no desespero, já viu né.

Rodrigo Jorge, muito obrigado pelos esclarecimentos que ajudaram este artigo a ficar mais completo.

Será que o bug deste one-off patch já foi corrigido neste patch que estou aplicando?

Não, este bug não foi corrigido na nova versão pois não encontrei o número dele dentro da lista de patches que serão aplicados pelo PSU que quero aplicar, apesar da Oracle informar que ele está corrigo no Bundle patch de Jan-2017. Preferi não arriscar e verificar como poderia aplica-lo novamente.

Então, o que fazer? Em alguma reunião alguém disse: “Vamos utilizar o parametro -skip_conflict”, neste momento os olhos da gerencia brilharam pois soava como uma luz no fim do tunel que poderia evitar uma SR com a Oracle. Fiquei triste em ser o portador da má notícia, informando que o skip_conflict iria somente evitar o patch conflitante, não o aplicando, e que não resolveria o problema.

-skip_conflict

If a conflict exist which prevents the patch from being applied, this flag can be used to skip the conflicting patches. Remaining patches will be applied after skipping conflicting patches. 

Pensei então no -force_conflict, afinal a função dele seria remover o patch conflitante (no meu caso o one-off patch 21131203) para que o PSU (patch 34057742) pudesse ser aplicado. Mas…

– Seria o opatchauto capaz de remover um patch sem ter seus arquivos no server somente com este parametro?

– E após a remoção, se o bug ainda existe, eu precisaria aplica-lo novamente, então melhor certificar-me de que isso é possível.

Como Jack (O estripador) decidi ir por partes. Vamos pesquisar sobre este one-off patch:

Este é o bug, a Oracle informa que o bug está corrigido a partir do Bundle Patch de Janeiro de 2017, mas pesquisando um pouco mais vi o seguinte:

Existem várias versões para este one-off patch, sendo elas específicas pra cada PSU, que vão até 2020, e o meu PSU específico consta nessa lista. Sendo assim, prezando pela minha saúde mental e paz de espírito, é melhor aplicar este one-off patch após o PSU.

Bom, ponto 1 resolvido. Vamos ao ponto 2.

Como fazer o roolback deste one-off patch sem os arquivos? Bom, eu não preciso deles mesmo ao usar o parametro -force_conflict no opatchauto.

-force_conflict
 If a conflict exist which prevents the patch from being applied, this flag can be used to force application of the patch. All the conflicting patches will be removed before applying the current patch.
Analysis for applying patches has completed successfully:

Host: linux-valdz
SIDB Home: :/OH12/oracle/prod/12.1.0.2
Version:12.1.0.2.0

==Following patches were SUCCESSFULLY analyzed to be applied:

Patch: <patch_location>/32758932
Log:/OH12/oracle/prod/12.1.0.2/cfgtoollogs/opatchauto/core/opatch/opatch2025-02-19_07-49-49AM_1.log

Patch: <patch_location>/34057742
Log:/OH12/oracle/prod/12.1.0.2/cfgtoollogs/opatchauto/core/opatch/opatch2025-02-19_07-49-49AM_1.log

Olha que show! Opatchauto passou sem problemas utilizando o -force_conflict, o que significa que ele irá fazer rollback do one-off patch conflitante e aplicará o PSU corretamente.

Após aplicar o patch corretamente, baixei o one-off patch na versão específica para o meu atual PSU e apliquei ele no database, o que ocorreu normalmente e sem nenhum problema:

INVENTORY

Oracle Interim Patch Installer version 12.2.0.1.43
Copyright (c) 2025, Oracle Corporation.  All rights reserved.


Oracle Home       : :/OH12/oracle/prod/12.1.0.2
   from           : :/OH12/oracle/prod/12.1.0.2/oraInst.loc
OPatch version    : 12.2.0.1.43
OUI version       : 12.1.0.2.0
Log file location : :/OH12/oracle/prod/12.1.0.2/cfgtoollogs/opatch/opatch2025-02-19_09-12-15AM_1.log

Lsinventory Output file location : :/OH12/oracle/prod/12.1.0.2/cfgtoollogs/opatch/lsinv/lsinventory2025-02-19_09-12-15AM.txt
--------------------------------------------------------------------------------
Local Machine Information::
Hostname: linux-valdz
ARU platform id: 226
ARU platform description:: Linux x86-64

Installed Top-level Products (1):

Oracle Database 12c                                                  12.1.0.2.0
There are 1 products installed in this Oracle Home.


Interim patches (4) :

Patch  21131203     : applied on Wed Feb 19 09:11:51 EST 2025
Unique Patch ID:  24846831
   Created on 1 Jul 2022, 04:22:13 hrs PST8PDT
   Bugs fixed:
     21131203
   This patch overlays patches:
     34057742
   This patch needs patches:
     34057742
   as prerequisites

Patch  34086863     : applied on Wed Feb 19 09:07:58 EST 2025
Unique Patch ID:  24841635
Patch description:  "Database PSU 12.1.0.2.220719,Oracle JavaVM Component (JUL2022)"
   Created on 29 Jun 2022, 08:00:17 hrs UTC
…

Patch  34057742     : applied on Wed Feb 19 08:44:27 EST 2025
Unique Patch ID:  24873298
Patch description:  "Database Patch Set Update : 12.1.0.2.220719 (34057742)"
   Created on 21 Jul 2022, 04:32:03 hrs PST8PDT
Sub-patch  33711081; "Database Patch Set Update : 12.1.0.2.220419 (33711081)"
Sub-patch  33477199; "Database Patch Set Update : 12.1.0.2.220118 (33477199)"
Sub-patch  33128590; "Database Patch Set Update : 12.1.0.2.211019 (33128590)"
Sub-patch  32768233; "Database Patch Set Update : 12.1.0.2.210720 (32768233)"
Sub-patch  32328635; "Database Patch Set Update : 12.1.0.2.210420 (32328635)"
Sub-patch  31985579; "Database Patch Set Update : 12.1.0.2.210119 (31985579)"
Sub-patch  31550110; "Database Patch Set Update : 12.1.0.2.201020 (31550110)"
Sub-patch  31113348; "Database Patch Set Update : 12.1.0.2.200714 (31113348)"
Sub-patch  30700212; "Database Patch Set Update : 12.1.0.2.200414 (30700212)"
Sub-patch  30340202; "Database Patch Set Update : 12.1.0.2.200114 (30340202)"
Sub-patch  29918340; "Database Patch Set Update : 12.1.0.2.191015 (29918340)"
Sub-patch  29494060; "Database Patch Set Update : 12.1.0.2.190716 (29494060)"
Sub-patch  29141015; "Database Patch Set Update : 12.1.0.2.190416 (29141015)"
Sub-patch  28729169; "Database Patch Set Update : 12.1.0.2.190115 (28729169)"
Sub-patch  28259833; "Database Patch Set Update : 12.1.0.2.181016 (28259833)"
Sub-patch  27547329; "Database Patch Set Update : 12.1.0.2.180717 (27547329)"
Sub-patch  27338041; "Database Patch Set Update : 12.1.0.2.180417 (27338041)"
Sub-patch  26925311; "Database Patch Set Update : 12.1.0.2.180116 (26925311)"
Sub-patch  26713565; "Database Patch Set Update : 12.1.0.2.171017 (26713565)"
Sub-patch  26609783; "Database Patch Set Update : 12.1.0.2.170814 (26609783)"
Sub-patch  25755742; "Database Patch Set Update : 12.1.0.2.170718 (25755742)"
Sub-patch  25171037; "Database Patch Set Update : 12.1.0.2.170418 (25171037)"
Sub-patch  24732082; "Database Patch Set Update : 12.1.0.2.170117 (24732082)"
Sub-patch  24006101; "Database Patch Set Update : 12.1.0.2.161018 (24006101)"
Sub-patch  23054246; "Database Patch Set Update : 12.1.0.2.160719 (23054246)"
Sub-patch  22291127; "Database Patch Set Update : 12.1.0.2.160419 (22291127)"
Sub-patch  21948354; "Database Patch Set Update : 12.1.0.2.160119 (21948354)"
Sub-patch  21359755; "Database Patch Set Update : 12.1.0.2.5 (21359755)"
Sub-patch  20831110; "Database Patch Set Update : 12.1.0.2.4 (20831110)"
Sub-patch  20299023; "Database Patch Set Update : 12.1.0.2.3 (20299023)"
Sub-patch  19769480; "Database Patch Set Update : 12.1.0.2.2 (19769480)"

Sendo assim, o problema do conflito foi resolvido sem que eu precisasse abrir uma SR na Oracle, salvando muito tempo para atingir o objetivo que era aplicar este PSU sem maiores problemas.

Como sempre, Fiquem a vontade para fazer quaisquer pontuações caso já tenham vivenciado algo do tipo.

Essa é a dica 0800 pra vocês desta vez.

“Saber das coisas vale ouro. Compartilhar esse conhecimento não tem preço.”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *