segunda-feira, 15 de junho de 2009

Troubleshooting XE – Parte II - Listener

Continuando a série troubleshooting, nesta segunda parte vou falar sobre o Listener. O Listener é um componente de uma arquitetura desenvolvida pela Oracle, chamada Net Services.

Como não dá para falar de Listener sem falar do Oracle Client, nesta segunda parte também vou falar um pouco sobre o Oracle Client, que deve ser instalado em máquinas onde rodam aplicações Cliente/Servidor e que acessam o banco de dados Oracle.

Para entendermos tanto o Listener, quanto o Oracle Client, é preciso uma introdução mínima aos fundamentos de conexão em rede da Oracle.


A Arquitetura de Redes da Oracle: Oracle Net Connections


Oracle Net Connections é a camada de software que reside tanto no lado do cliente quanto no lado do servidor de banco de dados oracle (servidor). É responsável por estabelecer e manter a conexão entre a aplicação cliente e o servidor, bem como o intercâmbio de mensagens entre eles, usando protocolos padrão da indústria. A Oracle Net é compreendida de dois componentes de software:

  • Oracle Net foundation layer
  • Oracle protocol suport

Oracle Net Foundation Layer (ONF)


Do lado do cliente, as aplicações se comunicam com a ONF para estabelecer e manter conexões. A ONF usa uma camada de suporte a protocolos da Oracle, que roda em cima de protocolos padrão de rede, como o TCP/IP, para se comunicar com o servidor.





Do lado do servidor, o funcionamento é similar ao do lado do cliente. O protocolo de rede envia as requisições do cliente para uma camada de suporte a protocolos da Oracle, que envia a informação para a ONF. A ONF então se comunica com o servidor, para processar as solicitações do cliente.




Oracle protocol suport

A Oracle Net foundation layer (ONF) usa a camada de suporte a protocolos da Oracle para se comunicar com os seguintes protocolos de rede padrão da indústria:
  • TCP/IP
  • TCP/IP with SSL
  • Named Pipes
  • SDP
A camada de suporte a protocolos da Oracle faz o mapeamento necessário entre a ONF e os protocolos padrão da indústria, usados para a comunicação entre máquinas em uma rede.

Oracle Net Listener

A única, porém importante função do Oracle Net Listener ou simplesmente Listener, é receber requisições de acesso ao servidor de banco de dados oracle. O Listener é configurado com um endereço e um protocolo. Clientes configurados com o mesmo protocolo podem enviar requisições de conexão para o Listener, no endereço em que ele se encontra (sempre do lado do servidor). Uma vez recebida a requisição, ela é passada para o servidor, quando então é estabelecida uma conexão direta entre o banco de dados e a aplicação cliente. Após estabelecida uma conexão entre o cliente e o servidor, o Listener “sai de campo”, pois já terá cumprido seu papel.


Oracle Net Client

Em uma estrutura cliente/servidor (tipicamente uma rede local), é necessário instalar o Oracle Net Client ou o que chamamos aqui no Brasil de Cliente Oracle. Consiste em instalar os componentes necessários para a Oracle Net foundation layer (ONF), que devem estar presentes na máquina cliente.


Using Easy Connect Naming on the Client


A partir da versão 10g, a Oracle introduziu o conceito de Easy Connect ou conexão fácil. Neste modo, não é preciso configurar coisa alguma no cliente. Basta instalar e pronto! Entretanto, os softwares precisam usar uma sintaxe de conexão da seguinte forma:

username/password@[//]host[:port][/service_name]

Se, por exemplo, o Oracle XE Server estiver rodando numa rede local em uma máquina cujo IP é 172.16.148.2, e você estiver numa máquina cliente querendo conectar-se ao servidor via SQL*Plus, basta fazer o seguinte:

sqlplus /nolog
SQL> CONNECT usuario/senha@172.16.148.2

Note que no exemplo acima só foi informado o que é obrigatório. Todos os defaults não foram informados (a // | a porta: 1521 | e o service_name:XE).

DICA: para conexões via URL ou JDBC, o uso das barras (//) é obrigatório antes do host:
usuario/senha@//172.16.148.2

Compatibilidade “para trás”: Oracle Names

O Oracle 10g e versões posteriores não suportam mais Oracle Names. Se você tiver aplicações em tua rede que foram desenvolvidas usando Oracle Names, basta você instalar versões anteriores do Oracle Client. Geralmente a versão Cliente do Oracle 9i resolve.

Como o público alvo deste Blog é o pessoal que usa o Oracle 10g e posteriores, não vou entrar em detalhes neste assunto. Mas a instalação de clientes de versões anteriores ao 10g consiste em duas etapas: a instalação do software cliente e sua configuração. A instalação é simples, via famoso avançar; e a configuração também é fácil: basta rodar o Oracle Net Configuration Assistant (ou netca, em linha de comando).

A configuração nada mais é que informar um Nome de Serviço e o IP ou nome do Host onde o Oracle Server está rodando. Através do Nome de Serviço é que tanto as aplicações quanto os utilitários, a exemplo do SQL*Plus, podem se conectar ao servidor.

Resumindo:

O Listener é um processo que reside num servidor de banco de dados Oracle, cuja responsabilidade é “ouvir” requisições de conexão que chegam dos clientes, além de gerenciar o tráfego para o servidor.

Quando um cliente solicita uma seção de rede com o servidor, um listener recebe a solicitação. Se as informações do cliente combinam com as informações do listener, é permitida uma conexão com o servidor de banco de dados.

Do lado da máquina cliente, é preciso instalar o Cliente Oracle. A partir da versão 10g, não há mais suporte ao Oracle Names e a conexão é feita no modo Easy Connect.


Enfim, O Listener


Na primeira parte desta séria, vimos como iniciar e parar o Listener. Vimos também como checar seu status. A partir de agora vamos estudar seu funcionamento, a fim de poder sanar eventuais problemas. Começaremos pela configuração do Listener e o arquivo listener.ora.

Configurando o Listener

Quando você instala o Oracle 10g XE, ele deixa o Listener configurado. Não há o que fazer neste aspecto. Além disto, é muito raro problemas com o Oracle XE, uma vez instalado e mantido em condições normais de temperatura e pressão :-). Se não ocorrer nenhuma pane no HD onde o XE foi instalado, você nunca terá que se preocupar com o Listener, nem com qualquer outra coisa mais séria.
Mas como o XE é usado por estudantes e até mesmo por desenvolvedores que instalam o XE em seus Desktops ou Notebooks, algumas coisas “inusitadas” podem acontecer e o XE parar de funcionar. Uma delas é o banco de dados rodar perfeitamente, mas o Listener não! O que impede, por exemplo, o SQL Developer ou a interface HTML de conectar ao banco de dados.

O arquivo listener.ora

Para que a gente possa entender o funcionamento do Listener, vamos “espionar” o arquivo listener.ora.
O arquivo listener.ora fica, tipicamente, em $ORACLE_HOME/network/admin, na plataforma Unix/Linux e ORACLE_HOME\network\admin na plataforma Windows. ORACLE_HOME é uma variável de ambiente.

Um arquivo listener.ora típico apresenta a seguinte configuração:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
(ADDRESS = (PROTOCOL = TCP)(HOST = SuSE111)(PORT = 1521))
)
)

DEFAULT_SERVICE_LISTENER = (XE)

A parte que nos interessa é a que está em negrito. E as linhas relevantes são as que estão na cor vermelha. As demais informações se devem ao fato que em um mesmo arquivo listener.ora pode existir configurações para mais de um Listener e para mais de uma instância Oracle (mais de um servidor na mesma máquina, rodando em paralelo). Na versão XE isto é irrelevante, pois só pode haver uma instância. Então nos concentremos nas linhas em vermelho.

A linha (ADDRESS = (PROTOCOL = TCP)(HOST = SuSE111)(PORT = 1521)) informa o protocolo padrão (PROTOCOL) sobre o qual a Oracle Net Foundation Layer está trabalhando, o nome da máquina (HOST) e a porta (PORT) através da qual o Listener estará “escutando”.

Esta informação deve ser passada para a equipe de desenvolvimento das aplicações, uma vez que é com base nestas informações que eles irão configurar o “string de conexão” para o Easy Connect Naming. Com base nas informações acima, uma conexão típica seria:

sqlplus /nolog
SQL> CONNECT usuario/senha@SuSE111:1521/XE

Como a porta 1521 é a porta padrão e o DEFAULT_SERVICE_LISTENER = (XE), a conexão poderia ser feita mais resumidamente assim:

sqlplus /nolog
SQL> CONNECT usuario/senha@SuSE111

O que pode dar errado no Listener?

Sinceramente? Pouquíssima coisa! Numa situação de produção, depois de instalado e configurado, só uma pane geral no HD da máquina servidora para causar algum problema, caso o HD danificado contenha o XE instalado nele. Neste caso, depois de sanado o problema, somente o Restore de um Backup que você, pessoa prevenida, deverá ter feito, irá resolver o problema.

Mas, e se eu tiver o XE instalado no meu Notebook ou numa estação de trabalho e apesar de aparentemente estar tudo Ok., mesmo assim o Listener não funcionar?

Bem, somente uma de duas coisas poderá ter acontecido:

  1. ou o arquivo listener.ora “sumiu”
  2. ou as informações contidas nele não estão mais “batendo” com a máquina!

A segunda “alternativa” é a mais provável! E a causa mais provável é uma mudança no nome do Host! Se você usar DHCP ou se tua máquina ingressar num domínio Windows, por exemplo, o nome do Host pode mudar sem você se dar conta, e isto é um problema para o Listener!

O Nome do Host mudou!

Por isto que é bom saber como iniciar, parar e verificar o status do Listener “manualmente”. Uma saída típica do Listener com mensagem de erro, por causa de troca de nome de host, é listada abaixo:

oracle@SuSE111:~> lsnrctl start

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 14-JUN-2009 23:29:33

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

Iniciando /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/tnslsnr: aguarde...

TNSLSNR for Linux: Version 10.2.0.1.0 - Production
O arquivo de parâmetros do sistema é /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.ora
Mensagem de log gravada para /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log
Atendendo em: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
Erro ao atender em: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SuSE)(PORT=1521)))
TNS-12545: A conexão falhou porque o objeto ou host de destino não existe
TNS-12560: TNS:erro de adaptador de protocolo
TNS-00515: A conexão falhou porque o objeto ou host de destino não existe


Falha ao iniciar o listener. Consulte a(s) mensagem(ns) de erro acima...

Assim fica fácil, não é? :-)

No linux, basta o comando uname -n para saber o nome do host. Então é só abrir o arquivo listener.ora e corrigir.

No windows, você precisa descobrir o nome do computador clicando com o botão direito em “Meu Computador” e selecionar Propriedades. Depois é clicar na aba [Nome do computador] e ver o que está escrito no campo “Nome completo do computador”.
Não é que eu implique com a Microsoft, mas isto acontece muito frequentemente no Windows e muito raramente no Linux!

Full Backup!

Uma outra situação não muito rara é que, pelo fato do XE ser pequeno em termos de ocupação de espaço em disco, algumas pessoas fazem um backup inteiro do XE, copiando toda a pasta para outro disco. Não deixa de ser uma solução!

Alguns até se aproveitam deste fato para copiar o XE de uma máquina para outra, simplesmente instalando o XE na outra máquina e depois "jogando" a cópia feita "por cima" da nova instalação. É também uma solução simples!


Mas ambas esbarram no pequeno detalhe que o nome do host provavelmente não será o mesmo. E por este pequeno detalhe muitos terminam descartando estas possiblidades, quando bastaria editar o arquivo listener.ora!

Nenhum comentário:

Postar um comentário