sexta-feira, 12 de junho de 2009

Troubleshooting XE – Parte I

Após a instalação de um banco de dados, começa a “rotina” de um DBA (DataBase Administrator): Backup/Restore; resolução de pequenos e grandes problemas causados ou pelo usuário ou por uma pane no Sistema Operacional; Medidas de segurança; etc. Neste primeiro artigo de uma série que chamarei troubleshooting, vou falar sobre dois componentes fundamentais de um servidor de banco de dados Oracle.

Para que um servidor de banco de dados baseado em Oracle possa funcionar perfeitamente, seja qual for a versão, é preciso que ao menos dois componentes fundamentais estejam funcionando: o Database Service e o Listener.

Como é necessário sabermos como as coisas funcionam normalmente, para sabermos o que fazer quando as coisas dão errado, vou começar explicando o funcionamento destas partes fundamentais. Nas próximas publicações, entrarei na questão de chamada deste tópico: o “troubleshooting”.

Database Service & Listener

O Database Service é o componente principal. É o que nós chamamos de uma Instância. Depois que você instala um servidor de banco de dados Oracle, é preciso criar uma instância de banco de dados. Normalmente, durante o processo de instalação lhe é dada a opção de criar esta instância ou deixar para depois. Na versão XE não há esta escolha: uma instância é criada automaticamente e ela é identificada por XE. Esta identificação é chamada de SID (System IDentifier). O SID do XE, seja no windows ou no linux, é sempre XE.

O Listener é um serviço que permite a comunicação entre o Database Server e os clientes. Os clientes a que me refiro são os usuários do banco de dados ou as aplicações que acessam o mesmo.




Sem o Listener, não há comunicação entre as estações remotas e o servidor (Database Server), mesmo que o Database Service esteja funcionando perfeitamente.

Identificando as partes

Inicie o XE da forma adequada ao teu SO e vamos neste momento conhecer os mecanismos para obter informações a respeito do Listener e do Database Service.

Trabalhando com o Listener

Existe um utilitário de linha de comando que serve para gerenciar as atividades do Listener. Algumas destas atividades são: iniciar; parar; e verificar o status. O nome do utilitário é lsnrctl.

Iniciando e Parando o Listener

Para iniciar ou parar o Listener, basta usar o utilitário lsnrctl, adicionando o comando que informa se você quer iniciar (start) ou parar (stop). Exemplo:

  • Iniciar o Listener

lsnrctl start

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)))
Atendendo em: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SuSE111)(PORT=1521)))

Estabelecendo conexão com (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
STATUS do LISTENER
------------------------
Apelido LISTENER
Versão TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Data Inicial 11-JUN-2009 20:13:50
Funcionamento 0 dias 0 hr. 0 min. 0 seg
Nível de Análise off
Segurança ON: Local OS Authentication
SNMP OFF
Serviço Default XE
Arq. Parâm. Listn. /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.ora
Arq. Log Listener /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log
Resumo de Atendimento...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SuSE111)(PORT=1521)))
Resumo de Serviços...
O serviço "PLSExtProc" tem 1 instância(s).
Instância "PLSExtProc", status UNKNOWN, tem 1 handler(s) para este serviço...
O comando foi executado com êxito

  • Parar o Listener

lsnrctl stop

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 11-JUN-2009 20:15:11

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

Estabelecendo conexão com (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
O comando foi executado com êxito

  • Verificar o Status do Listener

lsnrctl status

A saída deste comando é uma série de informações a respeito do status do listener. Há pouca variação de formato e informações se o XE está no Linux ou no Windows. Abaixo, a saída para o windows (em marrom) e logo depois para o linux (em azul), de uma situação normal, ou seja, o Listener está ativo e tudo funcionando perfeitamente bem.

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 04-JUN-2009 21:14:29

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

Estabelecendo conexão com (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
STATUS do LISTENER
------------------------
Apelido LISTENER
Versão TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
Data Inicial 11-JUN-2009 17:35:58
Funcionamento 0 dias 0 hr. 4 min. 17 seg
Nível de Análise off
Segurança ON: Local OS Authentication
SNMP OFF
Serviço Default XE
Arq. Parâm. Listn. C:\oraclexe\app\oracle\product\10.2.0\server\network\admin\listener.ora
Arq. Log Listener C:\oraclexe\app\oracle\product\10.2.0\server\network\log\listener.log
Resumo de Atendimento...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC_FOR_XEipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dreamer)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=8080))(Presentation=HTTP)(Session=RAW))
Resumo de Serviços...
O serviço "CLRExtProc" tem 1 instância(s).
Instância "CLRExtProc", status UNKNOWN, tem 1 handler(s) para este serviço...
O serviço "PLSExtProc" tem 1 instância(s).
Instância "PLSExtProc", status UNKNOWN, tem 1 handler(s) para este serviço...
O serviço "XEXDB" tem 1 instância(s).
Instância "xe", status READY, tem 1 handler(s) para este serviço...
O serviço "XE_XPT" tem 1 instância(s).
Instância "xe", status READY, tem 1 handler(s) para este serviço...
O serviço "xe" tem 1 instância(s).
Instância "xe", status READY, tem 1 handler(s) para este serviço...
O comando foi executado com êxito


LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 11-JUN-2009 17:36:36

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

Estabelecendo conexão com (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
STATUS do LISTENER
------------------------
Apelido LISTENER
Versão TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Data Inicial 11-JUN-2009 17:35:58
Funcionamento 0 dias 0 hr. 0 min. 38 seg
Nível de Análise off
Segurança ON: Local OS Authentication
SNMP OFF
Serviço Default XE
Arq. Parâm. Listn. /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.ora
Arq. Log Listener /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log
Resumo de Atendimento...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SuSE111)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=8080))(Presentation=HTTP)(Session=RAW))
Resumo de Serviços...
O serviço "PLSExtProc" tem 1 instância(s).
Instância "PLSExtProc", status UNKNOWN, tem 1 handler(s) para este serviço...
O serviço "XE" tem 1 instância(s).
Instância "XE", status READY, tem 1 handler(s) para este serviço...
O serviço "XEXDB" tem 1 instância(s).
Instância "XE", status READY, tem 1 handler(s) para este serviço...
O serviço "XE_XPT" tem 1 instância(s).
Instância "XE", status READY, tem 1 handler(s) para este serviço...
O comando foi executado com êxito


Como podem ver, não há muita diferença entre a saída no linux e a saída no windows, a não ser por pequenos detalhes de nome de host, caminhos de arquivos e etc. Então vamos ao que interessa!

  • Parâmetros e Log do Listener

Atenção para estas duas linhas:
Arq. Parâm. Listn. /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.ora
Arq. Log Listener /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log

listener.ora é o arquivo de parâmetros do Listener. Quando o Listener é iniciado, ele abre este arquivo, para poder se configurar adequadamente.
listener.log é o arquivo de Log do Listener. Uma série de informações de inciação e parada do Listener são gravadas neste arquivo. Se algo estiver dando errado, este é o primeiro arquivo que você deverá abrir, para identificar o problema.

Vamos prestar atenção agora em outras três linhas, abaixo de Resumo de Atendimento...:

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=SuSE111)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=8080))(Presentation=HTTP)(Session=RAW))

A segunda linha informa que o Listener está “escutando” através da porta (PORT) 1521, a porta padrão, e o nome da máquina (HOST) onde ele está rodando. Estas informações são importantes para quando você for configurar as estações clientes.

A terceira linha informa que a interface HTML do XE (HTTP) está disponível na porta 8080. Se ao iniciar o Listener você não visualizar esta linha, é porque ou o Database Service não está iniciado, ou ainda está iniciando. Explico: o Listener inicia muito rápido. Mas o Database Service demora mais um pouco e pode ser que o serviço HTTP ainda não esteja disponível se você por acaso solicitar o status do Listener logo após inciar o Database Service.

  • 127.0.0.1, o IP “cabalístico”

Se observaram bem, o HOST informado na terceira linha é o 127.0.0.1. Por que este número, ao invés do nome do host (SuSE111)? Bem, por hora basta saber que o serviço HTTP para a interface HTML do XE é oferecido pelo Database Service e não pelo Listener. O Listener apenas dá esta informação. Mas deixando de lado questões técnicas, vamos nos ater ao número.

127.0.0.1 é chamado IP de loop-back ou IP do localhost. Numa rede, localhost se refere sempre a máquina local, ou seja, a máquina onde “você está”! O número “cabalístico” 127.0.0.1 é o endereço IP de localhost. Confuso? Nem tanto...

Se você não tiver certeza de que está numa rede ou se não tiver certeza que a rede está operacional, mas quiser ter certeza que tua máquina está com os serviços de rede funcionando bem (primeiro passo para solucionar problemas de conexão em rede), basta você se referir a ela mesma, seja usando localhost ou o IP 127.0.0.1.
O comando ping é muito usado para ver se tua máquina está se comunicando com outras máquinas na rede. Mas serve também para checar se os serviços de rede em tua máquina estão rodando. Se você “pingar” tua própria máquina e ela não responder, nem adianta tentar se comunicar com as outras. Então se você fizer ping localhost ou ping 127.0.0.1 você deve obter alguma resposta.

Talvez por isto o endereço da interface HTML do XE seja o 127.0.0.1 (poderia ser localhost). Assim, não é preciso se preocupar com o nome do host, se você está na máquina onde o XE está rodando. Claro que para acessar através de outra máquina da rede, você precisa saber o nome do host ou seu endereço IP, na rede.

O Database Service

O Database Service é o serviço da instância do servidor de banco de dados sobre a qual você está trabalhando. Na caso do XE, como já se sabe, esta instância é identificada pelo SID XE. Se o Database Service não estiver “no ar”, não há meios de você trabalhar sobre o banco de dados.

Em outra matéria deste blog, quando falei sobre Tarefas após instalação no Windows e no Linux, expliquei como configurar o servidor para ser iniciado “manualmente”, tanto no windows, quanto no linux. Mesmo dito “manualmente”, aquela maneira é uma forma indireta de iniciar o banco de dados. Agora vamos ver como um verdadeiro DBA pode iniciar diretamente um banco de dados Oracle.

Existe um modo especial para se conectar ao Oracle, através do SQL*Plus, que permite a um DBA controlar o modo como o banco de dados é iniciado (start) ou parado (shutdown). Este modo especial permite, ainda, resolver eventuais problemas com o banco de dados. Por isto vamos estudá-lo agora.

Conectando-se como sysdba.

Tanto o usuário system quanto o usuário sys podem se conectar ao Oracle com a prerrogativa de sysdba. Esta prerrogativa dá poderes absolutos sobre o banco de dados, com ligeiras variações. Certas tarefas, podem ser executadas apenas pelo usuário system; outras, somente pelo usuário sys. Mas para controlar a instância do banco de dados, você pode usar tanto um quanto o outro.

Para fazer isto, basta entrar no SQL*Plus passando as credenciais usuário/senha, acrescentando a diretiva as sysdba. Exemplo:

sqlplus system/senha as sysdba

Usando as credenciais do sistema operacional

Outra maneira mais simples de se conectar é utilizar as credenciais do SO. Se você estiver conectado como um usuário pertencente ao grupo de DBAs do Oracle, basta usar a seguinte sintaxe:

sqlplus / as sysdba

A / colocada sozinha, sem usuário e senha, informa que é para o SQL*Plus usar as credenciais do usuário conectado no SO.

Dependendo de como o servidor está no momento em que você se conecta, o SQL*Plus exibirá as seguintes informações:

  • Servidor Parado (shutdown)

oracle@SuSE111:~> sqlplus / as sysdba

SQL*Plus: Releduction on Sex Jun 12 00:57:21 2009

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

Conectado a uma instância inativa.

SQL>

  • Servidor Rodando (startup)

SQL*Plus: Release 10.2.0.1.0 - Production on Sex Jun 12 01:10:51 2009

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


Conectado a:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

SQL>

Iniciando o banco de dados

Para iniciar uma instância Oracle basta, uma vez conectado como sysdba, usar o comando startup:

SQL> startup
Instância ORACLE iniciada.

Total System Global Area 805306368 bytes
Fixed Size 1261444 bytes
Variable Size 243269756 bytes
Database Buffers 557842432 bytes
Redo Buffers 2932736 bytes
Banco de dados montado.
Banco de dados aberto.

Parando o banco de dados

Quando quiser parar uma instância Oracle basta, uma vez conectado como sysdba, usar o comando shutdown:

SQL> shutdown
Banco de dados fechado.
Banco de dados desmontado.
Instância ORACLE desativada.

shutdown immediate, shutdown abort e shutdown normal

O modo default do comando shutdown é o modo normal. Nos exemplos acima, foi este o modo de shutdown da instância. Deu certo pois este exemplo foi dado num ambiente de testes. Mas no “mundo real” isto raramente funcionaria! Para entender isto, vamos ver o que diz a documentação:

Normal (default) - waits for in-flight work to complete
Immediate - terminates all sessions and does a rollback on all uncommitted transactions
Abort - aborts all sessions, leaving current DML in need of rollback, de-allocates the SGA and terminates the background processes.

  • Traduzindo em miúdos:

Normal – Espera que todos os trabalhos pendentes se completem, antes do shutdown. Isto é raríssimo de funcionar, pois qualquer conexão aberta com o banco de dados impedirá o shutdown. Além disto, acontece de as vezes existirem “sessões fantasmas”, ou seja, por alguma razão o Oracle “pensa” que tem alguém conectado, quando não há efetivamente ninguém. Se algum dia você esquecer deste detalhe e der um shutdown normal, não hesite em apertar CTRL+C após alguns minutos esperando pelo shutdown, sem nada acontecer!

Este modo é chamado por alguns DBAs de “clean shutdown”. Infelizmente, é muito raro de funcionar.

Immediate – termina todas as seções e faz um rollback em todas as transações não enviadas (commited). Talvez esta seja a melhor maneira de você interromper uma instância do Oracle. Este comando evita novos logins, faz um rollback de todas as transações pendentes e desativa a instância. Um shutdown immediate ainda garante um posterior startup bem mais rápido, pois não haverá muito trabalho de recuperação da instância.

Na maioria das vezes, o shutdown immediate funcionará “redondo”. Mas para o caso de ele não funcionar, existe o shutdown abort.

Abort – aborta (interrompe) todas as seções, deixando qualquer DML pendente de rollback, desaloca a SGA (System Global Area) e termina todos os processos de background. Este comando não causará nenhum dano ao banco de dados. O único “efeito colateral” é que o banco de dados levará mais tempo para se recuperar no próximo startup.

Resumo da Ópera

Este “post” foi bem extenso! Por isto vou fazer um resumo. Assim, da próxima vez que voltar aqui para fazer uma consulta rápida, basta vir aqui no final.

O Listener

O Listener é o responsável por “escutar” e atender as solicitações de conexão ao banco de dados. Para que ele seja iniciado e configurado adequadamente, busca informações no arquivo listener.ora.

O utilitário de linha de comando lsnrctl permite que você obtenha o status do Listener, interrompa (stop) ou inicie (start) o Listener. Para isto, basta executá-lo, passando o comando que desejar:

lsnrctl start ← Inicia o Listener
lsnrctl status ← Apresenta o status do Listener
lsnrctl stop ← Pára o Listener

O Dabase Service

O Database Service é a instância do Oracle responsável pelo provimento do banco de dados propriamente dito. Para que um DBA possa controlar o Database Service, ele pode se conectar com as prerrogativas de sysdba. A maneira mais simples e habitual é utilizar o comando

sqlplus / as sysdba

que utiliza o perfil do usuário conectado ao SO para fazer a autenticação. Este usuário precisa fazer parte do grupo dba, no linux ou ORA_DBA, no windows. Para dar um “tiro certeiro”, um DBA pode conectar-se usando as senhas do sys ou do system:

sqlplus system/senha as sysdba

Uma vez conectado como sysdba, um DBA pode iniciar (startup) ou parar (shutdown) uma instância do Oracle.

Com relação ao shutdown, o modo mais apropriado é usando o comando shutdown immediate. Mas se existir alguma situação em que este comando não funcione, utiliza-se o shutdown abort.

Na próxima publicação irei entrar, de fato, na resolução de problemas (troubleshooting) envolvendo o Listener e a Instância Oracle. Até lá...

2 comentários: