OLATOracle Log Analysis Tool Abrir a ferramenta
AtençãoRede & TNS

ORA-12154

Não resolveu o identificador de conexão

O ORA-12154 é, provavelmente, o erro mais comum na vida de quem trabalha com Oracle — e também um dos mais mal interpretados. A mensagem completa costuma ser “TNS:could not resolve the connect identifier specified”.

O ponto mais importante: este é um erro do lado do cliente. O banco de dados nunca chegou a receber a sua tentativa de conexão. Não adianta reiniciar a instância, checar o listener ou olhar o alert log — nada disso está envolvido. O que aconteceu foi que a máquina que tentou conectar não conseguiu traduzir o nome que você usou (o “connect identifier”) em um endereço de servidor.

Na prática, o cliente Oracle procurou aquele alias em algum lugar (normalmente o arquivo tnsnames.ora) e não encontrou — ou encontrou um arquivo com erro de sintaxe.

O que significa

Erro DO CLIENTE: o alias não foi achado no tnsnames.ora (ou LDAP) que o cliente usa — TNS_ADMIN errado, alias com typo, sintaxe quebrada.

Como o erro aparece

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

Passo a passo do diagnóstico consultas somente leitura

Descubra qual tnsnames.ora o cliente está lendo de verdade

Costuma ser o passo que resolve o caso. É comum existirem vários arquivos tnsnames.ora na máquina (um por Oracle Home, um do cliente, um do aplicativo) e o programa estar lendo um diferente do que você está editando. A variável TNS_ADMIN é quem determina o caminho usado.

Verifique a variável de ambiente

echo $TNS_ADMIN        # Linux/Unix
echo %TNS_ADMIN%       # Windows

Teste a resolução do alias

tnsping MEU_ALIAS

Isole o problema com EZConnect

Se a conexão abaixo funcionar, está provado que o banco, o listener e a rede estão bem — o problema é só de resolução de nome no cliente:

Conexão direta, sem usar tnsnames

sqlplus usuario/senha@//servidor:1521/nome_do_servico

Confira a sintaxe do tnsnames.ora

Erros clássicos: parênteses desbalanceados, alias com espaço antes do nome, uso de TAB em vez de espaço, ou um alias duplicado. Um único parêntese a mais invalida a entrada inteira — e às vezes as seguintes também.

Confira a ordem de resolução de nomes no sqlnet.ora

NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)

Ação imediata

Descubra QUAL tnsnames o cliente realmente lê (é quase sempre isso).

Correção definitiva

Corrigir alias/arquivo/variável; EZConnect elimina o tnsnames como suspeito.

Como prevenir

Padronizar TNS_ADMIN e distribuir tnsnames central.

Erros comuns — o que não fazer

  • Reiniciar o banco de dados. É um reflexo comum, mas aqui não ajuda: o servidor não chega a participar deste erro. O risco é causar uma indisponibilidade sem resolver o problema.
  • Editar o tnsnames.ora errado. Se a máquina tem mais de um Oracle Home, confirme o caminho com TNS_ADMIN antes de sair alterando.
  • Esquecer que a aplicação pode rodar com outro usuário do sistema operacional — e portanto com outro ambiente e outro TNS_ADMIN. Funcionar no seu sqlplus não garante que funcione no serviço da aplicação.
  • Confundir com o ORA-12514. Se o erro for 12514, a resolução funcionou e o listener respondeu — o problema é outro (serviço não registrado).

Perguntas frequentes

ORA-12154 é problema no servidor ou no cliente?

É no cliente. A mensagem indica que o software cliente não conseguiu resolver o identificador de conexão informado — a requisição sequer chegou ao servidor de banco de dados.

Qual a diferença entre ORA-12154 e ORA-12514?

No ORA-12154 o cliente não conseguiu sequer traduzir o alias em um endereço. No ORA-12514 o alias foi resolvido, o listener foi encontrado e respondeu — mas ele não conhece o serviço solicitado.

Preciso reiniciar o banco para corrigir ORA-12154?

Não. Reiniciar o banco não tem efeito sobre este erro, porque ele ocorre inteiramente no lado do cliente, antes de qualquer contato com o servidor.

Erros relacionados (Rede & TNS)

Vinicius Gabriel Lana

Vinicius Gabriel Lana

Sócio & CTO na MigraTI Soluções em TI · 8 anos como DBA (Oracle, SQL Server, PostgreSQL, MySQL)