Variáveis de ambiente podem influenciar no comportamento de uma instância de banco de dados Oracle, assim como outros processos no servidor que se comunicam com a instância, como processos de Listener, Grid, entre outros. Problemas relacionados a valores incorretos de variáveis de ambiente podem incluir erros de Timezone, Wallet, resolução de conexões TNS e etc.
Exemplo: Considere um cenário com Oracle RAC e Transparent Data Encryption (TDE). A wallet é armazenada em um ACFS compartilhado entre todos os nodes, as instâncias identificam o diretório da wallet através da configuração no arquivo sqlnet.ora abaixo de um $TNS_ADMIN customizado (definido via srvctl setenv). Se eventualmente alguém reiniciar uma das instâncias via SQLPLUS, ao invés de usar o SRVCTL, a instância poderia ser iniciada sem a variável TNS_ADMIN, causando erros na abertura da wallet.
Nesses casos “misteriosos”, checar quais variáveis de ambiente foram usadas durante a inicialização de um processo pode ajudar o DBA durante um troubleshooting.
Passo a Passo
1) Identifique o ID do processo com o comando ps, neste exemplo usaremos o processo do Listener:
ps -ef | grep tns

O ID do processo é apresentado na segunda coluna. Neste exemplo, vamos analisar o processo do Local Listener, com PID 124366.
2) Uma vez identificado o número do processo, podemos consultar o arquivo /proc/<PID>/environ.
cat /proc/124366/environ
Exemplo da saída:
$ cat /proc/124366/environ
__CRS_ACTIVE_VERSION=19.0.0.0.0__CLSAGFW_TYPE_NAME=ora.asm.typeCHECK_WRAP_TRACE=/u01/app/grid/crsdata/debug/oraagent_trace_needed.txtORA_CRS_HOME=/u01/app/19.0.0.0/grid__CRSD_CONNECT_STR=(ADDRESS=(PROTOCOL=IPC)(KEY=CRSD_IPC_SOCKET_11))NLS_LANG=AMERICAN_AMERICA.AL32UTF8CRF_HOME=/u01/app/19.0.0.0/gridGIPCD_PASSTHROUGH=falseENVCMD=/bin/env__CRSD_AGENT_NAME=/u01/app/19.0.0.0/grid/bin/oraagent_grid_ORA_AGENT_ACTION=TRUE__CRSD_MSG_FRAME_VERSION=2LD_LIBRARY_PATH=/u01/app/19.0.0.0/grid/lib:/etc/ORCLcluster/libWRAP_ENVFILE=/u01/app/grid/crsdata/debug/oraagent_env_98700.logSTART_MODE=FILEOWNER=__CLSAGENT_INCARNATION=1CRS_LIMIT_MEMLOCK=unlimitedFILEOWNER_ID=__CRS_START_MODE=normalORACLE_BASE=/u01/app/grid__CRS_DEPLOYMENT=otherWRAP_TRACELOG=/u01/app/grid/crsdata/debug/oraagent_trace_98700.log__CRS_PHYSICAL_HOSTNAME=ORASYM=/u01/app/19.0.0.0/grid/bin/oraagent.bin__CRS_RESOURCE_USE_ENABLED=1LSLCMD=/bin/ls -lCHECK_WRAP_ENV=/u01/app/grid/crsdata/debug/oraagent_env_needed.txtPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin__CRS_CPU_EQUIVALENCY=1000PWD=/ENV_FILE=/u01/app/19.0.0.0/grid/crs/install/s_crsconfig_server01_env.txtCRS_LIMIT_OPENFILE=400000LANG=en_US.UTF-8__CRS_CSS_CRITICAL=noCRS_LIMIT_NPROC=400000ORA_DAEMON_TRACE_FILE_OPTIONS=filesize=26214400,numsegments=10TZ=UTC__IS_HASD_AGENT=__CLSAGENT_LOG_NAME=ora.asm.type_gridEMOUT_PATH=/u01/app/grid/crsdata/server01/outputORA_DAEMON_LOGGING_LEVELS=AGENT=1,AGFW=0,CLSFRAME=0,CLSVER=0,CLUCLS=0,COMMCRS=0,COMMNS=0,CRSAPP=0,CRSCCL=0,CRSCEVT=0,CRSCOMM=0,CRSD=0,CRSEVT=0,CRSMAIN=0,CRSOCR=0,CRSPE=0,CRSPLACE=0,CRSRES=5,CRSRPT=0,CRSRTI=0,CRSSE=0,CRSSEC=0,CRSTIMER=0,CRSUI=0,CSSCLNT=0,SuiteTes=1,UiServer=0,OCRAPI=1,OCRCLI=1,OCRSRV=1,OCRMAS=1,OCRMSG=1,OCRCAC=1,OCRRAW=1,OCRUTL=1,OCROSD=1,OCRASM=1,CLSINET=0,CLSCEVT=0,CLSCAL=0,CLSO=0,GIPCLIB=2,GIPC=2,GIPCGEN=2,GIPCTRAC=2,GIPCWAIT=2,GIPCXCPT=2,GIPCOSD=2,GIPCBASE=2,GIPCCLSA=2,GIPCCLSC=2,GIPCEXMP=2,GIPCGMOD=2,GIPCHEAD=2,GIPCMUX=2,GIPCNET=2,GIPCNULL=2,GIPCPKT=2,GIPCSMEM=2,GIPCHAUP=2,GIPCHALO=2,GIPCHTHR=2,GIPCHGEN=2,GIPCHLCK=2,GIPCHDEM=2,GIPCHWRK=2,GIPCTLS=2,GIPCHGNS=2,SCLSOPCT=0__CLSAGENT_INCARNATIONTS=234104184SHLVL=1__CLSAGENT_LOGDIR_NAME=crsdLD_ASSUME_KERNEL=CRS_LIMIT_CORE=unlimited__CLSAGENT_USER_NAME=gridIDCMD=/usr/bin/idCRS_LSNR_STACK=32768__CRS_SERVER_LABEL=__CRS_STARTUP_PARAMETERS=CALOG_ID=164088886658487715/0/1/ 0ORACLE_HOME=/u01/app/19.0.0.0/gridCRS_LIMIT_STACK=2048TNS_ADMIN=/u01/app/19.0.0.0/grid/network/admin/ORA_NET2_DESC=6,9
3) Para listar uma variáveis por linha, podemos usar o comando strings.
strings /proc/124366/environ
Exemplo da saída:
$ strings /proc/124366/environ
__CRS_ACTIVE_VERSION=19.0.0.0.0
__CLSAGFW_TYPE_NAME=ora.asm.type
CHECK_WRAP_TRACE=/u01/app/grid/crsdata/debug/oraagent_trace_needed.txt
ORA_CRS_HOME=/u01/app/19.0.0.0/grid
__CRSD_CONNECT_STR=(ADDRESS=(PROTOCOL=IPC)(KEY=CRSD_IPC_SOCKET_11))
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
CRF_HOME=/u01/app/19.0.0.0/grid
GIPCD_PASSTHROUGH=false
ENVCMD=/bin/env
__CRSD_AGENT_NAME=/u01/app/19.0.0.0/grid/bin/oraagent_grid
_ORA_AGENT_ACTION=TRUE
__CRSD_MSG_FRAME_VERSION=2
LD_LIBRARY_PATH=/u01/app/19.0.0.0/grid/lib:/etc/ORCLcluster/lib
WRAP_ENVFILE=/u01/app/grid/crsdata/debug/oraagent_env_98700.log
START_MODE=
FILEOWNER=
__CLSAGENT_INCARNATION=1
CRS_LIMIT_MEMLOCK=unlimited
FILEOWNER_ID=
__CRS_START_MODE=normal
ORACLE_BASE=/u01/app/grid
__CRS_DEPLOYMENT=other
WRAP_TRACELOG=/u01/app/grid/crsdata/debug/oraagent_trace_98700.log
__CRS_PHYSICAL_HOSTNAME=
ORASYM=/u01/app/19.0.0.0/grid/bin/oraagent.bin
__CRS_RESOURCE_USE_ENABLED=1
LSLCMD=/bin/ls -l
CHECK_WRAP_ENV=/u01/app/grid/crsdata/debug/oraagent_env_needed.txt
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
__CRS_CPU_EQUIVALENCY=1000
PWD=/
ENV_FILE=/u01/app/19.0.0.0/grid/crs/install/s_crsconfig_server01_env.txt
CRS_LIMIT_OPENFILE=400000
LANG=en_US.UTF-8
__CRS_CSS_CRITICAL=no
CRS_LIMIT_NPROC=400000
ORA_DAEMON_TRACE_FILE_OPTIONS=filesize=26214400,numsegments=10
TZ=UTC
__IS_HASD_AGENT=
__CLSAGENT_LOG_NAME=ora.asm.type_grid
EMOUT_PATH=/u01/app/grid/crsdata/server01/output
ORA_DAEMON_LOGGING_LEVELS=AGENT=1,AGFW=0,CLSFRAME=0,CLSVER=0,CLUCLS=0,COMMCRS=0,COMMNS=0,CRSAPP=0,CRSCCL=0,CRSCEVT=0,CRSCOMM=0,CRSD=0,CRSEVT=0,CRSMAIN=0,CRSOCR=0,CRSPE=0,CRSPLACE=0,CRSRES=5,CRSRPT=0,CRSRTI=0,CRSSE=0,CRSSEC=0,CRSTIMER=0,CRSUI=0,CSSCLNT=0,SuiteTes=1,UiServer=0,OCRAPI=1,OCRCLI=1,OCRSRV=1,OCRMAS=1,OCRMSG=1,OCRCAC=1,OCRRAW=1,OCRUTL=1,OCROSD=1,OCRASM=1,CLSINET=0,CLSCEVT=0,CLSCAL=0,CLSO=0,GIPCLIB=2,GIPC=2,GIPCGEN=2,GIPCTRAC=2,GIPCWAIT=2,GIPCXCPT=2,GIPCOSD=2,GIPCBASE=2,GIPCCLSA=2,GIPCCLSC=2,GIPCEXMP=2,GIPCGMOD=2,GIPCHEAD=2,GIPCMUX=2,GIPCNET=2,GIPCNULL=2,GIPCPKT=2,GIPCSMEM=2,GIPCHAUP=2,GIPCHALO=2,GIPCHTHR=2,GIPCHGEN=2,GIPCHLCK=2,GIPCHDEM=2,GIPCHWRK=2,GIPCTLS=2,GIPCHGNS=2,SCLSOPCT=0
__CLSAGENT_INCARNATIONTS=234104184
SHLVL=1
__CLSAGENT_LOGDIR_NAME=crsd
LD_ASSUME_KERNEL=
CRS_LIMIT_CORE=unlimited
__CLSAGENT_USER_NAME=grid
IDCMD=/usr/bin/id
CRS_LSNR_STACK=32768
__CRS_SERVER_LABEL=
__CRS_STARTUP_PARAMETERS=CALOG_ID=164088886658487715/0/1/ 0
ORACLE_HOME=/u01/app/19.0.0.0/grid
CRS_LIMIT_STACK=2048
TNS_ADMIN=/u01/app/19.0.0.0/grid/network/admin/
ORA_NET2_DESC=6,9
4) Com o resultado formatado com comando strings, podemos usar o comando grep para buscar por uma variávei específica. No exemplo abaixo, estamos filtrando a variável “TZ”:
strings /proc/124366/environ | grep TZ
Exemplo da saída:
$ strings /proc/124366/environ | grep TZ
TZ=UTC
Normalmente o arquivo /proc/<PID/environ pertence ao usuário dono do processo (o mesmo listado na primeira coluna na saída do comando ps -ef), mas em alguns casos pode ser necessário acesso com root para consultar o arquivo.
Conclusão
Este post apresentou uma forma simples de listar todas as variáveis de ambiente de um determinado processo no sistema operacional Linux, usando um processo do Listener Oracle como exemplo. Essa abordagem pode ser usada como técnica de troubleshooting, permitindo avaliar possíveis discrepâncias entre diferente processos, tais como: Listener vs Instância (pmon), Instância A vs Intância B, Node 1 vs Node 2 e etc.