Social Icons

23 de ago de 2012

Entendendo o Oracle Net Services e o arquivo TNSNAMES

Olá pessoal,

     Estou escrevendo este artigo sobre Oracle Net Services e o arquivo tnsnames.ora porque já recebi e-mails de vários leitores do meu blog pedindo ajuda sobre este assunto e recentemente vi gente com a mesma dificuldade nos fóruns do GPO e Gluke.net. 

     O assunto é básico, mas profissionais que estão iniciando seus trabalhos com Bancos de Dados Oracle, tem dificuldade de configurar, encontrar ou utilizar o arquivo  tnsnames.ora  para que as suas aplicações acessem o Banco de Dados (BD) Oracle. 

      Primeiramente, antes de comentar exclusivamente sobre o arquivo  tnsnames.ora, vamos entender o que é o Oracle Net Services e sua relação com o arquivo citado. Oracle Net Services é um serviço da Oracle utilizado para estabelecer e manter conexões entre um cliente (máquina do usuário ou servidor de aplicação) e o servidor de BD Oracle. No servidor de BD, Oracle Net usa um processo ativo chamado listener para gerenciar conexões entre as aplicações e o servidor de Banco de Dados. As aplicações (remotas) não podem se conectar ao servidor de BD sem um listener. Um único listener pode servir múltiplas instâncias de BD e milhares de conexões clientes, porém ele poderá atender bem seus clientes, se  ele receber no máximo 200 conexões simultâneas. Se o BD tiver mais que 200 conexões simultâneas, crie mais de um listener para que ele não seja um ponto de gargalo para conexões com o BD.

    Resumidamente, o listener é utilizado para habilitar conexões de entrada no BD e seu papel principal é o de intermediador entre conexões de usuário não locais e uma instância de BD Oracle. Sua configuração pode ser realizada através do arquivo listener.ora, que por sua vez, pode ser editado através de qualquer editor de texto ou através de outros softwares e utilitários, como por exemplo o Enterprise Manager e o Net Manager. Este arquivo  pode conter as seguintes informações:
          - Nome da instância do BD (ou serviço);
          - Informações sobre o endereço ou o host do listener;
          - Protocolos suportados pelo listener;
          - Porta monitorada pelo listener.
 
     Segue abaixo um exemplo de conteúdo do arquivo de configuração do listener, chamado listener.ora:

# listener.ora Network Configuration File: 
LISTENER =
  (DESCRIPTION_LIST = 
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    ) 

    Oracle Net suporta 4 métodos de resolução de nomes, que possibilitam a conexão com o BD:
     
        1- Easy connect:
         - Conexão estabelecida através de "string de conexão", composta pelo nome do host do BD, número da porta do listener e nome do serviço (pode ser a instance name). Se não for especificado a porta, utiliza-se a porta padrão 1521. Se não for fornecido nome de serviço, Oracle Net assume que o nome do serviço é igual ao nome do host;
         - Esse tipo de conexão é muito utilizada por aplicações desenvolvidas em Java que se conectam ao BD via JDBC;
         - Este método é habilitado por padrão e não exige configuração nos clientes;
         - Não suporta SSL e trabalha somente com TCP/IP;
         - Opções de conexão avançadas, tais como: roteamento, connect time failover e balanceamento não são suportadas.
         - Exemplo de conexão utilizando easy connect via SQLPlus:
                  CONNECT user/senha@host:1521/service
     
        2- Nomeação local:
            Usuário fornece um álias para a conexão com o Oracle Net Service. Oracle Net tenta encontrar o álias com os serviços definidos localmente, em um arquivo de resolução de nomes, chamado tnsnames.ora. Se encontrar, resolve o alias no protocolo, host, porta e serviços especificados no arquivo.
            Este método suporta todos os protocolos do Oracle Net e suporta opções de conexão avançadas, tais como: roteamento, connect time failover e balanceamento (muito úteis para ambientes com RAC e DataGuard).
            Ideal para organizações que não mudam frequentemente as configurações de serviços Oracle Net.          
         
        3- Nomeação de diretório:
            Similar ao método de nomeamento local onde a aplicação fornece um alias para conexão. O alias é mantido em um serviço externo que pode ser pesquisado por meio do protocolo LDAP, que acessa o Oracle Internet Directory (OID) ou Microsoft Active Directory.
            Assim como o método de nomeamento local, este método suporta todos os protocolos do Oracle Net e opções de conexão avançadas.
            Ideal para organizações que podem mudar com mais frequência as configurações de serviços Oracle Net.
           
        4- Nomeação externa:
            Similar ao método de nomeamento de diretório, com a diferença de que este método suporta serviços de nomeamento de terceiros, tais como Cell Directory Services (CDS), Distributed Computing Enviroment (DCE) e Network Information Services (NIS).

     Dentre os métodos citados acima, o mais conhecido e comumente utilizado, é o nomeamento local, que utiliza o arquivo tnsnames.ora, na máquina cliente. Segue abaixo um exemplo de conteúdo deste arquivo:


ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
 
     Uma máquina cliente windows, por exemplo, pode ter vários diretórios de softwares Oracle. Ela pode ter, por exemplo, um cliente do Oracle 10g e outro do 11G. Os diretórios em que estes softwares estão instalado são chamados de Oracle Home. Neste caso, temos 2 Oracle Homes na mesma máquina e cada Oracle Home possui sua estrutura de pastas que definem os seus serviços de rede Oracle (através dos arquivos tnsnames.ora e sqlnet.ora). A subpasta do Oracle Home que contém os arquivos Oracle Net Services chama-se network/admin.

     Se temos mais de um Oracle Home, como saber qual deles é o Oracle Home que o seu programa deve estar usando para ler o tnsnames.ora? Você pode verificar isso abrindo um prompt do DOS e executando o comando tnsping + apelido do BD contido no arquivo tnsnames.ora (Ex.: tnsping orcl) . Ao executar este comando irá aparecer o caminho completo do arquivo sqlnet.ora. Este arquivo tem como função principal definir os métodos de conexão que o cliente poderá utilizar para acessar um ou mais BDs via Oracle Net Services. Na mesma pasta do sqlnet.ora, está o arquivo tnsnames.ora que o seu programa está utilizando. Se você não conseguir executar o comando acima ou se o sistema não funcionar do jeito que você esperava, configure uma variável de ambiente com o nome TNS_ADMIN (ver exemplo da Imagem 01) e valor contendo o caminho completo da pasta onde está o arquivo tnsnames.ora que você deseja utilizar, como no exemplo da imagem abaixo:

Imagem 01 - Configurando a variável de ambiente TNS_ADMIN

     Para simplificar um pouco mais o que expliquei nos parágrafos acima, o Oracle Net Services pode ser composto por 3 arquivos principais:
           - listener.ora: Localizado na máquina servidora
           - sqlnet.ora: Localizado na máquina cliente (que também pode ser uma máquina servidora)
           - tnsnames.ora: Localizado na máquina cliente (que também pode ser uma máquina servidora)

     Para que você consiga efetuar uma conexão em um ambiente de BD Oracle, é necessário apenas que você saiba configurar estes arquivos. Para quem quiser mais informações e sugestões de solução para problemas comumente encontrados em Oracle Net Services, tais como os erros TNS-03505, TNS-12541 e ORA-12154, sugiro a leitura do artigo Evitando os erros de TNS – Parte I.


Por hoje é só!

[]s
 
Referência:
    Treinamento oficial Oracle: Workshop Administration II

29 comentários:

  1. Olá Fabio e se o Banco de Dados está configurado com Ldap eu posso conectar via tnsnames por ele?
    Pois nos bancos que são com tnsnames eu conecto de boa, mas nos que são ldap eu não consigo...tenho que fazer algo diferente?
    Obrigada

    ResponderExcluir
    Respostas
    1. Anônimo, sim vc pode se conectar também via tnsnames, basta configurar corretamente o arquivo sqlnet.ora na máquina cliente. Dentro dele tem que ter uma entrada parecida com: NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES). Para mais informações leia http://www.orafaq.com/wiki/Ldap.ora

      []s

      Excluir
  2. Boa Tarde Fabio existe forma de eu ter usuários conectando com ldap e sem ldap. O Melhor eu posso usar mais de uma forma de atenticação para os usuários do banco

    ResponderExcluir
    Respostas
    1. David, vc pode usar um ou todos os métodos de conexão juntos, basta configurar adequadamente o sqlnet.ora e os clientes para utilizar o método de conexão desejado, OK?

      Excluir
  3. Fabio, otimo artigo, gostaria de saber se o listener por algum motivo ele cair, tem como ele subir automaticamente no windows server?

    ResponderExcluir
  4. Fábio,

    Ótimo post! Compreendi bastante sobre o assunto. Mas continuo enfrentando um problema. Instalei o Oracle 10g em uma VM Windows XP, ao instalar ela não tinha ip fixo e o ip que o oracle assumiu foi o da rede em modo NAT da VM. Posteriormente essa VM precisou ser acessada em uma rede e passou a ter um ip fixo também, logo a VM passou a ter dois IPs (o primeiro é necessário para acesso da VM ao mundo externo). Contudo, com a entrada da nova interface de rede, ao tentar conectar no banco apresenta o ORA-28547.

    Já tentei trocar o ip no listener.ora, também tentei adicionando o ip, e nada.

    Acidentalmente eu acabei descobrindo que se desativar e reativar a segunda interface, passa a funcionar, não sei por qual motivo, mas funciona.

    ResponderExcluir
    Respostas
    1. Glauber, primeiramente obrigado pelo comentário. Em segundo lugar, como nunca passei por este problema não sei qual seria a melhora forma de resolvê-lo. Sugiro que procure ajuda no fórum do GPO. Talvez alguém lá já tenha passado por isso e saiba como te ajudar da melhor forma!

      []s

      Excluir
  5. Fábio
    Venho pesquisando bastante sobre qual curso fazer de pós graduação, no momentos gostaria de saber sobre o que acha do MBA em administração de banco de dados Oracle na IBTA, e pela experiência que tem qual a sua opinião sobre a instituição?
    A UNIP também possui um MBA que tenho afinidade e entre as duas qual o peso delas.

    ResponderExcluir
    Respostas
    1. Dario, entre IBTA e UNIP eu escolheria IBTA, mas é importante avaliar o conteúdo programático das 2 formações e se possível avalie também os instrutores que irão dar cada curso. Pesquise o currículo deles... essa é a melhor forma de vc fazer uma avaliação completa e tomar a decisão correta!

      []s

      Excluir
    2. Fabio, por favor, veja se consegue me ajudar. Todas as máquinas clientes se conectavam normal ao servidor do banco de dados. Do nada só passaram a se conectar a estações que estão na mesma que o servidor (172.168.1.200), ou seja somente as estações da mesma LAN (172.168.1.xxx) as estações que usam a VPN e estão em outra LAN como 172.168.2.xxx á não conseguem se conectar. E não é firewall, não é rota, já vi de tudo e não está relacionado a rede. Você tem noção do que pode ser ?

      Excluir
    3. William, me parece um problema de rede ou listener. Aqui no artigo ensinei a verificar o listener usando o tnsping. Para verificar se é rede execute os testes básicos com os comando ping e telnet na porta 1521 (porta padrão do oracle, se ele não foi alterada). Se tiver dúvidas de como fazer isso, sugiro que procure algum especialista em redes na empresa em q vc trabalha, pois ele conhece o ambiente de rede da empresa e poderá te ajudar melhor!

      []s

      Excluir
  6. Prezado Fábio,

    O artigo é maravilhoso, curti muito.
    Hoje estou enfrentando um problema meio chato, pois tenho um servidor windows com oracle 11g, mas ontem estávamos configurando o acesso externo e não deu muito certo. O arquivo tnsnames.ora e listener.ora estavam com o host = localhost e só funcionava conectando localmente.
    Nós paramos o servidor do listener, pelo o comando no executar, LSNRCTL, e demos o comando no aplicativo, STOP listener, parando o serviço, em seguida alteramos os arquivos na mão (Listener e TNSNAMES), para tentar o acesso externo, modificando para o nome da maquina. mas o erro mudou ou evoluiu, então decidimos retornar para localhost para continuarmos do mesmo jeito e todas as aplicações locais voltaram a funcionar naquele momento. Passado um dia o serviço do listener não inicia e agora só ocorre o erro, TNS-12560 e TNS-00530, isso quando tento inicia-lo. Você acha que posso fazer algo?

    ResponderExcluir
    Respostas
    1. Pedro, desculpe a demora, mas só vi hoje essa msg. Tente colocar o IP da máquina no listener e veja se as conexões externas começam a funcionar, ok?
      []s

      Excluir
  7. Olá fabio, poderia me tirar uma duvida? estou realizando alguns estudos para a certificação OCA 12c, entretanto, tenho uma duvida referente ao metodo Easy connect, no livro da sybex está escrito "■ No advanced connection descriptor features are allowed such as connection pooling or external procedure calls." , entretanto, logo em seguida dentro do próprio topico sobre DRCP o livro usa um exemplo dessa maneira "Easy Connect: host:port/service_name:POOLED" , confesso que fiquei confuso, poderia me esclarecer essa duvida? obrigado!:)

    ResponderExcluir
    Respostas
    1. Tiago, isso é confuso mesmo! Easy Connect não é indicado quando você precisa de recursos avançados de conexão, tais como chamadas a procedimentos externos e pooling no lado do servidor de aplicação. No 11G a Oracle criou o DRCP que é um pooling gerenciado pelo próprio SGBD. É este último que você consegue também usar com Easy Connect na string host:port/service_name:POOLED, ok? De qq forma, ignore-o, ele ainda não é muito bom, pooling no servidor de aplicação ainda é bem melhor, ok?

      []s

      Excluir
  8. Fábio,

    Muito legal legal o artigo. Consegui aprender algumas coisas interessantes e importantes. Estou passando por problema semelhante ao do Pedro Thuco, inclusive com os mesmos erros (TNS-12560 e TNS-00530). Instalei o XE em uma Notebook WIN7 32bits e estou tentando acessá-lo de um PC WIN7 64 bits. Pelas mensagens de erro fornecidas e por inúmeras pesquisas que fiz na Internet, parece que esse erro acontece quando o problema é FÍSICO (com o hardware). Porém, quando dou um ping do PC para o Note ele responde normalmente. Desinstalei e reinstalei o XE novamente e acabei descobrindo que o Listener não é inicializado, apesar de estar setado como "Automático" no "Tipo de Inicialização" dos serviços. Quando tento iniciá-lo pela janela de Serviços, ele me dá a seguinte mensagem: "O serviço OracleXETNSListener em Computador local foi iniciado e interrompido. Alguns serviços são interrompidos automaticamente se não estiverem sendo usados por outros serviços ou programas". Já procurei muito, chegando até a ver caso de acontecer isso devido a estouro do arquivo de log do Listener (maior que 2GB), o que não era o meu caso. Você tem por acaso alguma "luz no fim do túnel" ?

    Muito obrigado. Abraço.

    ResponderExcluir
    Respostas
    1. Adalberto, dificilmente instalo Oracle em windows e não lembro de ter passado por estes problemas. De qq forma, tente iniciar o listener manualmente abrindo uma janela de prompt de comandos, entrando na pasta bin do Oracle Home, e por fim, digitando lsnrctl start

      []s

      Excluir
    2. Oi Fábio...

      Não sei realmente o que aconteceu anteriormente. Porém, novamente desinstalei o Oracle, apaguei as variáveis de ambiente, apaguei a pasta de instalação, passei o CCleaner no registro do Windows e fiz outro download do instalador. Instalei novamente e fui verificar as variáveis de ambiente. Não entendi... Em todos os sites que procurei havia a informação de que as variáveis de ambiente seriam ORACLE_HOME e ORACLE_BASE (verifiquei no registro e elas estavam lá). Mas nas variáveis de ambiente (sistema) ele criou uma com o nome de "caminho" com o path até a pasta "bin". Verifiquei os serviços e lá estava o bendito do Listener carregado e recebendo requisições da minha outra máquina. BELEZA !!!

      Obrigado. Valeu pela força.

      []'s.

      Excluir
  9. Boa tarde Fábio!

    Em minha máquina tinha um client do 11g instalado, quando instalei o client do 10g fui instruído a criar as viáveis de ambiente ORACLE_HOME e TNS_ADMIN (o que não havia feito quando instalei o 11g, mas funcionava normalmente) ambas apontando para os arquivos do 10g. Agora, não consigo mais conectar na instancia do 11g.

    Será que agora devo inserir nestas variáveis de ambiente o caminho do 11g?

    ResponderExcluir
    Respostas
    1. Willian, pq vc instalou o client do 10G? Já que fez isso, vc terá que unificar as entradas dos arquivos tnsnames.ora em um só e aponte o TNS_ADMIN para a pasta deste arquivo.

      []s

      Excluir
    2. Questões de projeto que tive de atuar.
      Obrigado pela dica.

      Excluir
    3. Normalmente não é necessário ter mais de 1 Oracle Client. Muitos instalam várias versões sem saber disso, ok?
      []s

      Excluir
  10. Boa noite Fábio, estou com o mesmo problema do Willian Lopes, tenho cliente 12c pois preciso acessar DBs 12c,11g e instalei o XE 10g para poder acessar um DB 9i. O problema é que só ler o tnsname do xe10g depois que instalei. Para ler o tnsname do client12c é preciso tirar a variavel ambiente do xe10g. Como faço para utilizar os dois tnsnames sem precisar ficar alterando as variaveis de ambiente?

    ResponderExcluir
    Respostas
    1. Allan, não tem como. Será necessário fazer as alterações.

      Excluir
  11. Fabio criei dois Listener:
    LISTENER_CEL1: 1521 e LISTENER_CEL2:1421, o corre que somente o LISTNER_CEL1 responde. Como subir o segundo Listener?.

    ResponderExcluir
    Respostas
    1. Jn, para subir o listener default utilizando o utilitário lsnrctl, basta digitar "lsnrctl start". Qualquer segundo listener ou listener com nome diferente do default, para subir você tem que acrescentar o nome dele no comando. Ex: "lsnrctl start LISTENER_CEL2.

      Outra coisa, por que você está criando 2 LISTENERS? Recomenda-se, em geral, criar 1 listener para atender cada 200 conexões simultâneas . Você tem mais que 200 conexões simultâneas ocorrendo no(s) BD(s) que o listener atende?
      []s

      Excluir

 

Meus últimos Links Favoritos

Suporte remoto alunos

Seguidores

Meu One Drive (antigo Sky Drive)