This post is also available in:
Ao tentar abrir uma sessão local com sqlplus / as sysdba, o Oracle encerra a conexão antes mesmo de autenticar:
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Dec 2 01:54:17 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-12547: TNS:lost contact
Enter user-name: ^CO impacto é imediato: o DBA perde acesso local ao banco. Sem uma sessão sysdba, startup, shutdown e qualquer operação administrativa de emergência ficam indisponíveis.
Por Que Acontece
O ORA-12547 em uma conexão local (/) indica que o processo Oracle foi iniciado — ou tentou ser iniciado — mas a comunicação via IPC (bequeath pipe) falhou imediatamente. As causas mais comuns são:
ORACLE_HOMEcom path incorreto (trailing slash, diretório inexistente ou variável de ambiente desatualizada)- Permissões erradas no binário
$ORACLE_HOME/bin/oracle
O Oracle não consegue localizar ou executar o binário corretamente, e o TNS interpreta isso como “lost contact”.
Diagnóstico Rápido
Antes de aplicar qualquer solução, identifique a causa verificando o ORACLE_HOME que o processo está usando de fato e as permissões do binário:
ps -ef | grep pmon
oracle 42456 1 0 Dec01 ? 00:00:01 asm_pmon_+ASM
oracle 51812 1 0 02:35 ? 00:00:00 ora_pmon_scprbr07
oracle 55320 43687 0 02:42 pts/0 00:00:00 grep --color=auto pmon
xargs -0 -L1 -a /proc/51812/environ | grep ORACLE_HOME
ORACLE_HOME=/u01/app/oracle/product/19.3.0.0/dbhome_1/ls -l $ORACLE_HOME/bin/oracle
-rwxr-xr-x 1 oracle oinstall 441253104 Dec 2 02:03 oracleSe o ORACLE_HOME terminar com / ou apontar para um diretório inexistente, vá para as Soluções 1 ou 2. Se as permissões do binário não forem -rwsr-s--x, vá para a Solução 3.
Solução 1 — Trailing Slash no /etc/oratab
Um / extra ao final do caminho do ORACLE_HOME no /etc/oratab faz o oraenv montar a variável com um separador duplicado, quebrando a resolução de binários.
Verifique:
cat /etc/oratab
+ASM:/u01/app/19.0.0.0/grid:N
scprbr07:/u01/app/oracle/product/19.3.0.0/dbhome_1/:NCorrija removendo o / final, recarregue o ambiente e teste:
. oraenv
ORACLE_SID = [scprbr07] ? scprbr07
The Oracle base remains unchanged with value /u01/app/oracle
sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Dec 2 02:06:33 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>Se o banco estiver registrado no srvctl (ambientes RAC ou Grid Infrastructure), o srvctl mantém um registro próprio do ORACLE_HOME — corrija lá também:
srvctl config database -d scprbr07
Database unique name: scprbr07
Database name:
Oracle home: /u01/app/oracle/product/19.3.0.0/dbhome_1/
Oracle user: oracle
Spfile: +DATA/SCPRBR07/PARAMETERFILE/spfile.257.1145122115
Password file: +DATA/SCPRBR07/PASSWORD/pwdscprbr07.278.1088971723
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups: DATA
Services: scprbr07_serv
OSDBA group:
OSOPER group:
Database instance: scprbr07srvctl modify database -d scprbr07 -o /u01/app/oracle/product/19.3.0.0/dbhome_1Após corrigir no srvctl, faça stop/start do banco para ele subir com o ORACLE_HOME correto.
Solução 2 — ORACLE_HOME Incorreto no Ambiente do Shell
O /etc/oratab pode estar correto, mas o ORACLE_HOME definido no .bash_profile ou .bashrc pode apontar para um diretório inexistente — situação comum após patches que alteram o path do Oracle Home.
Verifique:
echo $ORACLE_HOME
/u01/app/oracle/product/19.3.0.0/dbhome_INEXISTENTE
ls -d $ORACLE_HOME
ls: cannot access '/u01/app/oracle/product/19.3.0.0/dbhome_INEXISTENTE': No such file or directoryCorrija o .bash_profile com o path real, ou use o oraenv para redefinir corretamente:
. oraenv
ORACLE_SID = [scprbr07] ? scprbr07
The Oracle base remains unchanged with value /u01/app/oracleConfirme o path correto localizando o binário Oracle instalado:
find /u01 -name "oracle" -type f -perm /u+x 2>/dev/null
/u01/app/oracle/product/19.3.0.0/dbhome_1/bin/oracleSolução 3 — Permissões Incorretas no Binário oracle
⚠️ Atenção: o comando abaixo altera permissões de um binário crítico do Oracle. Execute como
rootou comsudo. Em ambientes RAC, aplique em todos os nós.
O binário $ORACLE_HOME/bin/oracle precisa ter os bits setuid e setgid ativos (permissão 6751) para que o Oracle consiga escalar privilégios internamente. Se essas permissões foram removidas por hardening, deploy incorreto ou reinstalação, a conexão local falha com ORA-12547.
Verifique:
ls -l $ORACLE_HOME/bin/oracle
-rwxr-xr-x 1 oracle oinstall 441253104 Dec 2 02:03 oracleCorrija e confirme:
chmod 6751 $ORACLE_HOME/bin/oracle
ls -l $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle oinstall 441253104 Dec 2 02:03 oracleTeste a conexão:
sqlplus / as sysdba
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>Checklist Rápido
ps -ef | grep pmon | grep -v grep
xargs -0 -L1 -a /proc/<PID>/environ | grep ORACLE_HOME
cat /etc/oratab | grep -v "^#"
ls -d $ORACLE_HOME
ls -l $ORACLE_HOME/bin/oracle
chmod 6751 $ORACLE_HOME/bin/oracle
. oraenv
sqlplus / as sysdbaErros Conhecidos
ORA-12547 persiste após corrigir o oratab em ambiente RAC O srvctl mantém um registro próprio do ORACLE_HOME. Corrija com srvctl modify database -d e faça stop/start do banco.
chmod 6751 falha com “Operation not permitted” O comando precisa ser executado como root. Em sistemas com SELinux ou políticas de hardening de SO, pode ser necessário ajustar políticas antes de alterar permissões de setuid.
Referências
- Oracle Database Error Messages 19c — ORA-12547
- Oracle Support Doc ID 1093611.1 — Permissions and Ownership for Oracle Binaries (acesso via MOS)
