Quando realizamos uma aplicação de patch usando a abordagem Out-Of-Place, natualmente o caminho do ORACLE_HOME do GRID e do RDBMS são alterados. Essa característica que é responsável por proporcionar os principais benefícios dessa abordagem, também acaba sendo a responsável por uma necessidade de ajuste adicional em arquivos de variáveis de ambiente como “.bash_profile” ou “.bashrc”.
Diferentemente do “/etc/oratab”, esses arquivos não são atualizados automaticamente pelo processo do patch, seja ele realizado com FPP, switchGiHome ou OPatchAuto. Esse é um comportamento esperado, uma vez que arquivos como o “.bash_profile” são específicos do SO, e não do Oracle em si. Em teoria, esses arquivos são de responsabilidade do usuário, enquanto arquivos como /etc/oratab são de responsabilidade do software Oracle (apesar que a gente também edita ele manualmente).
Neste post apresento uma abordagem que podemos usar para tornar o arquivo .bash_profile (ou qualquer outro arquivo de variável de ambiente) dinâmico de acordo ao que está configurado no arquivo /etc/oratab atualmente.
Exemplo
Originalmente, antes de fazer um switchHome, o ambiente tinha essa configuração:
Arquivo /etc/oratab:
+ASM:/u01/app/product/19.0.0.0/grid:N
cdbperf:/u01/app/oracle/product/19.0.0.0/db_1:N
Arquivo ~/.bash_profile do usuário oracle:
export ORACLE_SID=cdbperf
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/db_1
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
Arquivo ~/.bash_profile do usuário grid:
export ORACLE_SID=+ASM
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/product/19.0.0.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
Então, ao realizar uma operação de “Switch Home”, o arquivo /etc/oratab é atualizado automaticamente com o novo caminho do ORACLE_HOME:
+ASM:/u01/app/product/19.0.0.0/GI1921:N
cdbperf:/u01/app/oracle/product/19.0.0.0/DB1921:N
Mas nesse ponto, o arquivo .bash_profile continua com a variável de ambiente ORACLE_HOME com valor antigo e não é mais válido:
[oracle@labperf ~]$ grep ORACLE_HOME= .bash_profile
export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/db_1
Solução Alternativa
Para esse cenário, uma solução para simplificar a configuração desses arquivos de customização da sessão SSH sem a necessidade de adicionar script ou procedimento adicional após cada troca de ORACLE_HOME, podemos usar a variável de ambiente ORACLE_SID definida no “.bash_profile” para achar o caminho atual do Oracle Home no arquivo /etc/oratab, e por fim, defini-lo como o valor da variável ORACLE_HOME no próprio .bash_profile.
Exemplo:
export ORACLE_HOME=$(grep "^$ORACLE_SID" /etc/oratab | awk -F ":" '{print $2}')
Demonstração de como isso funciona na prática em modo AD-HOC na sessão SSH:
[oracle@labperf ~]$ cat /etc/oratab
+ASM:/u01/app/product/19.0.0.0/GI1921:N # line added by Agent
cdbperf:/u01/app/oracle/product/19.0.0.0/DB1921:N # line added by Agent
[oracle@labperf ~]$ unset ORACLE_HOME
[oracle@labperf ~]$ echo $ORACLE_HOME
[oracle@labperf ~]$ export ORACLE_SID=cdbperf
[oracle@labperf ~]$ export ORACLE_HOME=$(grep "^$ORACLE_SID" /etc/oratab | awk -F ":" '{print $2}')
[oracle@labperf ~]$ echo $ORACLE_HOME
/u01/app/oracle/product/19.0.0.0/DB1921
[oracle@labperf ~]$ export ORACLE_SID=+ASM
[oracle@labperf ~]$ export ORACLE_HOME=$(grep "^$ORACLE_SID" /etc/oratab | awk -F ":" '{print $2}')
[oracle@labperf ~]$ echo $ORACLE_HOME
/u01/app/product/19.0.0.0/GI1921
O arquivo .bash_profile do usuário oracle neste exemplo ficaria assim:
export ORACLE_SID=cdbperf
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$(grep "^$ORACLE_SID" /etc/oratab | awk -F ":" '{print $2}')
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
E o do grid ficaria assim:
export ORACLE_SID=+ASM
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=$(grep "^$ORACLE_SID" /etc/oratab | awk -F ":" '{print $2}')
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
Note que nessa abordagem, a variável de ambiente ORACLE_SID deve estar definida no arquivo antes da variável ORACLE_HOME.