Você está na página 1de 10

ORACLE

Evitando os erros de TNS Parte 01


04 de fevereiro de 2009 por Rodrigo Almeida
Ol, amigos. Muitos profissionais, principalmente iniciantes, tm ou j tiveram bastantes problemas de conexo com o banco de
dados Oracle, os conhecidos erros de TNS, sigla para Transparent Network Substrate. Esses erros ocorrem durante uma
tentativa de conexo com o banco de dados ou at mesmo quando se est utilizando Database Link (DBLINK) para uma outra
base de dados.
As origens desses erros podem ser diversas e sempre estaro ligadas com o SQL
NET ou a sua infra-estrutura de rede
LAN/WAN. Para quem no conhece o SQL
NET ou Net8 (Antes do Oracle8i), um produto de middleware da Oracle que oferece suporte para as conexes (Transparent
Connection) entre cliente/servidor, entre bancos de dados Oracle ou ambientes no-Oracle (Transparent Gateways).
Porm, nossa meta no conhecer as solues e arquitetura de rede do Oracle Server, e sim, solucionar os principais problemas
de TNS. Mas antes devemos conhecer trs arquivos que compe uma arquitetura de rede Oracle e importantes para iniciar a
nossa jornada, so eles:
Listener.ora
Arquivo de configurao de ouvinte no lado do servidor. Ele fornece as principais configuraes como:
Nome nico do banco de dados (Unique Name);
Protocolo de Comunicao e porta de acesso;
Servios do Listener e Home Oracle associados verso da base.
A origem desse arquivo sempre em $ORACLE_HOME/network/admin em Unix\Linux
e%ORACLE_HOME%\network\admin para Windows, onde ORACLE_HOME a origem da sua instalao do Oracle
Server. Abaixo segue um modelo simples do Listener.ora..
LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.72.0.171)(PORT = 1521))

)

)

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = PLSExtProc)

(ORACLE_HOME = /u01/app/oracle/product /10. 2. 0/db._1)

(PROGRAM = extproc)

)

(SID_DESC =

(GLOBAL_DBNAME = ranet.world)

(ORACLE_HOME = /u01/app/oracle/product /10. 2. 0/db._1)

(SID_NAME = ranet)

)

)
LEMBRETE!
Esse arquivo geralmente encontrado no servidor que est instalado o banco de dados e no na mquina cliente. E,
resumidamente, ele que fornece o suporte de conexo ao banco de dados.
Tnsnames.ora
Arquivo de configurao para acesso aos bancos de dados Oracle, configurado tanto no lado cliente ou servidor. Ele fornece as
informaes de destino dos banco de dados, como:
Nome do banco de dados (SID);
Tipo de Protocolo, Nome do servidor e Porta de conexo.
Abaixo segue um exemplo do contudo de um arquivo Client:
ranet.world =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.72.0.171)(PORT = 1521))

)

(CONNECT_DATA =

(SID = ranet)

)

)
Podemos encontrar o arquivo no diretrio $ORACLE_HOME\network\admin em Unix\Linux
e %ORACLE_HOME%/network/admin em Windows da mquina cliente ou servidor, onde a instalao do Oracle Home pode
ser de um simples Client Oracle ou Oracle Server.
LEMBRETE!
O arquivo tnsnames.ora deve ser configurado no lado cliente e servidor de banco de dados e aplicao, no lado cliente para
permitir o usurio acessar o banco de dados, nos servidores de banco de dados para validar a utilizao de DBLINKs e nos
servidores de aplicao para permitir a conectividade.
Sqlnet.ora
Arquivo de configurao que habilita alguns recursos de rede para o cliente ou banco de dados, como:
Tipo de nomeao de metdos;
Habilita logs e traces;
Recursos avanados de segurana e entre outros.
Assim como os outros arquivos, pode ser encontrado em$ORACLE_HOME\network\admin em Unix\Linux
e %ORACLE_HOME%/network/adminem Windows da mquina cliente ou servidor.
Bom, depois de algumas suaves explicaes dos arquivos de configurao, vamos discutir um check list antes de entrar nos
problemas de TNS. Esse check list tem como funcionalidade encontrar os possveis problemas antes de realizar qualquer
alterao nos arquivos do SQL*NET mencionados acima. O check list consiste nas seguintes tarefas:.
1) PING
Antes de qualquer coisa, faa um ping para o IP do servidor e veja se ele est respondendo na rede, como o exemplo abaixo:
C:\>ping 10.72.0.171

Disparando contra 10.72.0.171 com 32 bytes de dados:

Resposta de 10.72.0.171: bytes=32 tempo=81ms TTL=60

Resposta de 10.72.0.171: bytes=32 tempo=70ms TTL=60

Resposta de 10.72.0.171: bytes=32 tempo=137ms TTL=60

Resposta de 10.72.0.171: bytes=32 tempo=96ms TTL=60

Estatsticas do Ping para 10.72.0.171:

Pacotes: Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de perda),

Aproximar um nmero redondo de vezes em milissegundos:

Mnimo = 70ms, Mximo = 137ms, Mdia = 96ms
Ter a resposta do servidor j um bom comeo, caso no tenha, existem alguns possveis problemas:
1. O servidor est com outro endereo IP;
2. O cabo de rede no est conectado ao servidor;
3. O servidor pode estar bloqueado no Firewall;
4. Verificar as regras de firewall do seu usurio para o servidor especfico;
5. Para ambientes distribudos, verifique se o link entre as unidades est ativo;
6. Verificar se a(s) placa(s) de rede do servidor esto habilitadas;
7. Verificar se o servidor est no domnio desejado ou em uma DMZ, se sim, verificar se possui acesso.
Todos os problemas mencionados acima tratam diretamente da infra-estrutura e configurao do servidor em questo, portanto
no tem que realizar nenhum tipo de configurao ou manuteno no seu ambiente Oracle.
2) TNSPING
O SQL*NET fornece um aplicativo chamado TNSPING, que pode ser executado diretamente no servidor ou da mquina
cliente, ele utilizado para determinar se o Listener do banco de dados alvo est ativo ou no. Pois, em alguns momentos,
podemos ter uma base com o status OPEN (online), porm, o seu servio de Listener est parado, deste modo no permite
acesso dos usurios. Veja um exemplo:.
C:\>tnsping ranet

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 15-JAN-2009 10:42:10

Copyright (c) 1997, 2007, Oracle. All rights reserved.

Arquivos de parmetros usados:

D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

Usado o adaptador TNSNAMES para resolver o apelido

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = tcp.world)
(PROTOCOL = TCP) (Host = 10.72.0.171) (Port = 1521)) (

ADDRESS = (COMMUNITY = tcp.world) (PROTOCOL = TCP) (Host = 10.72.0.171) (Port = 1521)))
(CONNECT_DATA = (SID = ranet)))

OK (80 ms)
Diferente do PING, o TNSPING j faz um teste do servio de conexo diretamente no banco de dados desejado. No exemplo,
utilizei o alias RANET para o banco de dados RANET, que o alias configurado em meu tnsnames.ora, a mensagem final de
OK diz que possvel realizar a conexo com o banco de dados..
Mas para ter do sucesso de conexo para seu banco de dados, tudo vai depender do status que a sua instncia se encontra, pois
se o banco de dados estiver em NOMOUNT (no montado) ou MOUNT (montado), o teste de conexo com o TNSPING ir
funcionar, porm, o acesso no ser possvel, assim sendo, quando acessar a aplicao ou SQL*PLUS, ter um erro como o
abaixo:
C:\>sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on Qui Jan 15 13:43:16 2009
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

SQL> conn system@ranet
Informe a senha:

ERROR:
ORA-01033: ORACLE initialization or shutdown in progress
Isso porque o seu banco de dados se encontra em status NOMOUNT ou MOUNT, ou tambm como a mensagem diz, em
processo de SHUTDOWN em modo immediate, normal ou transacional.
Utilizando ainda o TNSPING, possvel medir o tempo de resposta do servio de Listener, colocando um valor N para o teste,
conforme o exemplo:
C:\>tnsping ranet 5

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 15-JAN-2009 10:49:21

Copyright (c) 1997, 2007, Oracle. All rights reserved.

Arquivos de parmetros usados:

D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

Usado o adaptador TNSNAMES para resolver o apelido

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = tcp.world)
(PROTOCOL = TCP) (Host = 10.72.0.171) (Port = 1521)) (

ADDRESS = (COMMUNITY = tcp.world) (PROTOCOL = TCP) (Host = 10.72.0.171) (Port = 1521)))
(CONNECT_DATA = (SID = ranet)))

OK (50 ms)

OK (60 ms)

OK (60 ms)

OK (80 ms)

OK (80 ms)
Acima, foram realizadas 5 tentativas, ou como alguns preferem, 5 saltos. Com essa opo do TNSPING fornecida para cada
salto o tempo de resposta da mquina origem para o banco de dados destino, e com isso tambm podemos entrar problemas de
performance. Caso o tempo de resposta esteja alto de um valor tolerado, que de 0 a 200 ms (milisegundos), pode comear a
verificar alguns problemas de rede.
Atrves do TNSPING, comeamos a receber alguns erros de TNS, que podemos discutir abaixo:
TNS-03505
Esse erro acontece geralmente quando se tenta realizar um teste de conexo (TNSPING) para um banco de dados que no est
registrado no tnsnames.ora da mquina cliente ou servidor, exemplo:
C:\>tnsping ranet99

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 15-JAN-2009 10:57:52

Copyright (c) 1997, 2007, Oracle. All rights reserved.

Arquivos de parmetros usados:

D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

TNS-03505: Falha ao determinar o nome
Soluo
Existem algumas possveis solues simples para esse erro especfico de TNS, que so:
Colocar o nome correto do banco de dados;
Verifique se o alias que est tentando conectar est cadastrado no seu arquivo tnsnames.ora;
Verifique se o alias necessita utilizar o .WORLD ao final do nome, o .WORLD significa que de um domnio global, e sua
configurao pode ser feita alterando o nome do alias no tnsnames.ora para RANET.WORLD;
Talvez seja necessrio colocar o parmetro NAME.DEFAULT_ZONE = WORLD no arquivo sqlnet.ora;
Verifique o tipo de nomeao utilizado pelo parmetro NAMES.DIRECTORY_PATH.
TNS-12541
Esse erro retornado quando o servio do Listener no est online, ou est com outro tipo de configurao, exemplo:
C:\>tnsping ranet

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 15-JAN-2009 11:09:24

Copyright (c) 1997, 2007, Oracle. All rights reserved.

Arquivos de parmetros usados:
D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

Usado o adaptador TNSNAMES para resolver o apelido
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (Host =
10.72.0.171) (Port = 1521))) (CONNECT_DATA = (SID = ranet)))

TNS-12541: TNS:no h listener
Soluo
Nos casos mais simples, para resolver esse problema basta ativar novamente o servio do Listener no banco de dados alvo. Para
isso, utilize a ferramenta LSNRCTL (Listener Control) fornecida junto com o SQL*NET, atrves de linha de comando para
habilitar novamente o servio, exemplo:
C:\>lsnrctl

LSNRCTL for 32-bit Windows: Version 10.2.0.4.0 - Production on 15-JAN-2009 11:13:41

Copyright (c) 1991, 2007, Oracle. All rights reserved.

Bem vindo ao LSNRCTL, digite "help" para obter informaes.

LSNRCTL> start LISTENER

Starting D:\oracle\product\10.2.0\db_1\bin\tnslsnr: please wait...

TNSLSNR for Windows: Version 10.2.0.4.0 - Production
System parameter file is D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
Log messages written to D:\oracle\product\10.2.0\db_1\network\log\listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.72.0.171)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.72.0.171)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Windows: Version 10.2.0.4.0 - Production
Start Date 15-JAN-2009 11:10:26
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
Listener Log File D:\oracle\product\10.2.0\db_1\network\admin\listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.72.0.171)(PORT=1521)))
Services Summary...
Service "ranet" has 1 instance(s).
Instance "ranet", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
Perceba que ao acessar o aplicativo LSNRCTL (Listener Control), emiti o comando start LISTENER, para iniciar o servio do
Listener, por padro o nome do ouvinte LISTENER, ento eu poderia apenas deixar start que resolveria, porm, se coloquei
outro nome ao LISTENER, basta iniciar com start <nome_do_listener>, e para saber se existe outro nome de Listener
configurado no seu SQL*NET, basta verificar o seu arquivo listener.ora do servidor de banco de dados.
Existem outros checks que devem ser feitos para evitar esse tipo de erro, so:
Verificar o hostname e porta do arquivo listener.ora;
Verificar o nome do Listener atual no LSNRCTL;
ORA-12154
O mesmo que o erro TNS-12154, onde no h um Listener para conexo, porm, ele emitido dentro do banco de dados
Oracle, por isso o motivo do ORA no incio, e esse erro quando se est utilizando um DBLINK para um determinado banco
de dados e o ALIAS utilizado no DBLINK no corresponde ao banco de dados. Exemplo:
SQL> select count(*) from NOTAS_FISCAIS@RANET_SP.WORLD;
select count(*) from NOTAS_FISCAIS@RANET_SP.WORLD
*
ERRO na linha 1:

ORA-12154: TNS:could not resolve service name
Soluo
A soluo para esse tipo de problema igual ao do TNS-12154, porm necessita de mais detalhes, como:
Verificar qual o alias que o DBLINK est utilizando para realizar a comunicao, fazendo o SELECT abaixo:
SQL> select owner, db_link, username, host from dba_db_links;

OWNER DB_LINK USERNAME HOST
---------- --------------- ------------------------------ ---------------
PUBLIC RANET_SP.WORLD dbara RANET_RO

1 linha selecionada
A coluna HOST fornece o nome do alias que ser utilizado para realizar a comunicao com outro banco de dados. Esse alias
o mesmo encontrado no arquivo tnsnames.ora, ento, para resolver o problema, basta no arquivo de tnsnames colocar um alias
chamado RANET_RO para o hostname, porta e SID corretos, deste modo o DBLINK volta a funcionar. Existem outras coisas
que devemos prestar ateno como mencionado nos erros TNS acima, como:.
1. Verificar se necessrio utilizar o .WORLD para o domnio global;
2. Verificar o NAMES.DIRECTORY_PATH e NAME.DEFAULT_DOMAIN do sqlnet.ora do servidor de banco de dados;
3. Executar os testes de PING e TNSPING.
PRONTO! Com essa introduo aos erros de TNS e um pequeno overview dos principais arquivos do SQL*NET, j
conseguimos realizar alguns testes simples e que podem nos ajudar e nosso dia-a-dia de trabalho. Lembrando que essa foi
somente a primeira parte, ter a segunda parte com mais alguns tipos de erros TNS e suas respectivas solues.
Abraos,

Artigos relacionados
Utilizando o Google Maps no Oracle APEX
OracleComente!
Utilizando itens no Oracle APEX
OracleComente!
Utilizando collections para criao de formulrios tabulares no Oracle APEX Parte 03
OracleComente!

Rodrigo Almeida
Rodrigo Almeida, DBA Oracle h mais de 10 anos um dos DBAs mais influentes do pais e mantm seu prprio Portal e Frum
(www.rodrigoalmeida.net), eleito ORACLE ACE em 2009 pela Oracle Corporation, cursou Eng. da Computao pela UNISANTA,
graduado em Analise de banco de dados e ps-graduando em BI pela Veris Faculdades, especialista em Micro-eletrnica pelo INSA
em Toulouse/Frana. Possui certificaes OCP 9i/10g/11g, OCE SQL Expert, OCS 11g Implementations e Exadata e mais de 14
certificaes Oracle. vice-presidente do grupo de usurios Oracle do Brasil (GUOB), colunista Oracle do portal iMasters e
colaborador tcnico para os principais portais e revistas Brasileiras e internacionais. participante dos Beta Program da Oracle
Coporation para solues de banco de dados e instrutor oficial da Oracle University Brasil para os treinamentos de BD e Exadata e
atualmente DBA Oracle e DMA Exadata na CDS e consultor tcnico da Oracle do Brasil focado no gerenciamento e implementao
de Oracle Exadata, Exalogic e tecnologias de banco de dados e aplicaes Oracle. Tambm proprietrio da empresa UNIDBA
Treinamento & Consultoria em TI (www.unidba.net).
Pgina do autor Email
Leia os ltimos artigos publicados por Rodrigo Almeida
Introduo ao Oracle Berkeley DB XML
Torne-se um OCA com 2 certificaes
Criando uma VM Windows Server 2008 no Virtualbox Parte 2
Criando uma VM Windows Server 2008 no Virtualbox Parte 1
Instalao do Oracle Virtualbox 4. 0. 2.
COMENTE TAMBM
6 COMENTRIOS

Avelino Ferreira
Muito boa essa matria!
Estava procurando alguma matria sobre SP e acabei encontrando essa sobre TNS!
Ontem desistalei minha o Oracle em casa por causa de alguns erros que estava tendo!
A maioria deles, depois de ler esse seu texto, era justamente sobre TNS.
Muito obrigado pela matria!!!!
H 5 anos Responder

Oclides Jnior
Parabns Rodrigo por esta matria! estou comeando agora nesta rea e j consegui me orientar atrvs de suas
informaes.
Muito Obrigado.
H 4 anos Responder

Prezado Rodrigo, tudo bem? Quanto ao trecho Arquivo de configurao para acesso aos bancos de dados Oracle,
(configurado tanto no lado cliente ou servidor). eu discordo, porque a configurao do TNSNAMES.ORA necessria
apenas por PARTE DE CLIENTE. Na verdade, a STRING de conexo descrita nesse arquivo vai indicar o endereo de
rede onde reside o listener. uma espcie de DNS do Oracle.
H 4 anos Responder

Giovanni Souza
Bom dia, matria excelente esta, meu problema diferente dos descritos acima, irei explicar.
Possuo um windows server 2008 r1, instalei o oracle 10g client para esta plataforma, configurei o tnsnames, at a td ok,
s que quando vou mi conectar ao banco, o sqlplus ou outro aplicativo como o plsql ou toad travam, o servidor est
pingando no oracle server, consigo dar telnet no ip e porta do banco, o tnsping retorna ok, porm a conexo trava
quando tento mi conectar.
Alguem j viu esse erro ?, estou com esse problema a 2 semanas, se algum puder mi ajudar agradecerei muito.
Abrao
H 3 anos Responder

Reiner Silva
Rodrigo, estou com uma dvida. Foi feito uma troca de servidor de banco de dados de uma filial do meu trabalho. A
requisio ao BD feita via dblink, porm est gerando um erro que os dois servidores x1 e x2 esto fazendo
requisies para um dblink. O host foi alterado no tnsnames do servidor novo no caso x2. O que pode est acontecendo
para gerar esse erro?.
Obrigado.
H 9 meses Responder

joel
Me ajudou pra caramba. Muito Obrigado!
H 5 meses Responder