Atenção: esse artigo tem uma palestra complementar. Clique e assista!

De que se trata o artigo?

Criação de scripts para monitoramento de banco de dados Oracle.


Para que serve?

Scripts que ajudarão o DBA na detecção pró-ativa de possíveis problemas com o banco de dados, bem como verificar o estado atual do backup, saúde geral do banco de dados, etc.


Em que situação o tema é útil?

Uma das tarefas cruciais do DBA é a verificação constante da situação geral do banco de dados. Os scripts criados neste artigo ajudarão nesta tarefa do dia-a-dia, enviando e-mails para o DBA informando a situação geral do banco de dados.

Uma das tarefas mais importantes de qualquer administrador de banco de dados é justamente a tarefa de monitorar o banco de dados para detectar, de maneira pró-ativa, possíveis problemas que possam comprometer a aplicação devido a falhas no banco de dados.

Dentro desta tarefa de monitoramento, o DBA deverá verificar diariamente os arquivos de log do banco de dados (Alert.log, arquivos de trace, etc.), verificar se o backup foi executado com sucesso, conferir o estado geral de performance, áreas de memória, etc.

Sem dúvida nenhuma, esta é uma tarefa que demanda tempo e deve ser encarada como o "café da manhã" do DBA. Uma das primeiras coisas que faço diariamente é esta verificação. A grande questão é a quantidade de bancos de dados que você administra. Caso administre um ou dois bancos de dados, esta tarefa não será tão maçante, mas como na maioria dos casos (incluindo o meu), o número de bancos de dados que o DBA é responsável é considerável e conectar-se ao servidor de cada um dos bancos de dados e efetuar uma verificação detalhada poderá consumir, em alguns casos, mais do que a manhã inteira, sem contar na quantidade de e-mails de usuários, desenvolvedores, gerentes, etc. que temos que responder.

Agora imagine uma situação em que, ao chegar na empresa ou mesmo ligar o notebook em casa, você já verifique a caixa de entrada de seu e-mail e já veja, logo de cara, e-mails enviados pelos servidores de banco de dados lhe passando todas as informações que citamos acima. Com certeza é algo que lhe poupará um bocado de tempo e lhe permitirá utilizar o seu tempo de maneira muito mais produtiva e eficiente, "atacando" os problemas de maneira eficaz.

É justamente este ponto que irei atacar neste artigo, criando uma série de scripts que, quando "instalados" no servidor de banco de dados, auxiliarão muito o DBA.

Definindo o ambiente

A primeira coisa a ser feita sempre que algum script precisa ser executado é definir todas as variáveis de ambiente, e neste arquivo iremos abordar apenas os sistemas operacionais UNIX e Linux.

Existem duas formas para se definir todas as variáveis de ambiente necessárias para a execução de um script:

1. Definir todas as variáveis necessárias "dentro" do próprio script;

2. Criar um arquivo de definição do ambiente e "chamá-lo" no script.


Neste artigo irei utilizar a segunda opção, pois ela traz enormes vantagens, como por exemplo, quando algum valor deve ser modificado em função de upgrade do banco de dados ou até mesmo o e-mail do DBA que irá receber o relatório.

Irei criar um arquivo com o nome de .dba.env, isso mesmo, iniciando com um ponto (.) e com a extensão .env. Ao iniciar o nome do arquivo com um ponto, definimos que o mesmo se trata de um arquivo oculto e que não será listado por um simples comando ls –l, precisaremos utilizar uma opção a mais no comando, ou seja, teremos que usar ls –la.

Este arquivo deve ser criado no diretório home do usuário oracle no servidor de banco de dados. O padrão é o diretório /home/oracle.

A Listagem 1 apresenta o conteúdo do arquivo .dba.env.

Listagem 1. Conteúdo do arquivo .dba.env.


 1. # Este arquivo tem o proposito de definir todas as variaveis
 2. # de ambiente necessarias relativas a instancia de banco de
 3. # dados oracle
 
 4. oratab_list="/var/opt/oracle/oratab /etc/oratab"
 5. FOUND=FALSE
 
 6. if [[ $# -eq 1 ]]
 7. then
 8. export ORACLE_SID=$1
 9. for oratab in $oratab_list
 10. do
 11. if [ -f $oratab ]; then
 12. FOUND="TRUE"
 13. break
 14. fi
 15. done
 
 16. if [ "$FOUND" = "TRUE" ]; then
 17. export ORACLE_HOME=`grep "$ORACLE_SID:" $oratab |cut -f2 -d':'`
 18. export ORACLE_BASE="/`echo $ORACLE_HOME |cut -f2,3 -d'/'`"
 19. export SHLIB_PATH=$ORACLE_HOME/lib:/usr/lib
 20. export LD_LIBRARY_PATH=$ORACLE_HOME/lib
 21. export TNS_ADMIN=$ORACLE_HOME/network/admin
 22. export PATH=$ORACLE_HOME/bin:/usr/ccs/bin:$PATH
 23. else
 24. echo Nao foi possivel encontrar informacoes relativas ao ORACLE_HOME
 25. exit 1
 26. fi
 27. else
 28. export ORACLE_SID=""
 29. export ORACLE_HOME=""
 30. export ORACLE_BASE=/oracle
 31. fi
 
 32. export MAIL_LIST="ricardo@sqlmagazine.com.br"
 33. export MAIL_PGM="/usr/bin/mailx"
 34. export COMPRESS_PGM="/usr/contrib/bin/gzip"
 35. export EXCLUDE_OWNER="('SYS', 'SYSTEM', 'OUTLN', 'PERFSTAT', 'DBSNMP')"

Vamos entender o que acontece neste primeiro script. A linha 4 define uma variável chamada oratab_list, que irá armazenar uma lista com as possíveis localizações do arquivo oratab (Nota DevMan 1). Por padrão, no Sun Solaris, o arquivo oratab é o /var/opt/oracle/oratab. Já no HP-UX, AIX e Linux o arquivo oratab é o /etc/oratab.

Caso o padrão de sua empresa seja o de colocar o arquivo oratab em outra localização, basta adicionar na lista do oratab_list.

Nota DevMan 1. O arquivo oratab.

O oratab é um arquivo criado pelo Oracle quando o software do banco de dados é instalado. Originalmente, o oratab era usado pelo SQL*Net V1, mas atualmente ele é utilizado para listar os bancos de dados e versões dos softwares de banco de dados instalados no servidor.

O arquivo oratab pode conter comentários, sempre iniciados pelo símbolo sustenido (#) e cada linha fará referência a informações de cada banco de dados instalado no servidor e o formato é:

ORACLE_SID:ORACLE_HOME:Y|N

Como por exemplo:

SQLMAG:/oracle/u01/software/rdbms/11.0.1:Y

ORACLE_SID é o system ID da instância do banco de dados;

ORACLE_HOME é o diretório de instalação do software de banco de dados associado à instância;

Y\N indica se a instância deve ser inicializada automaticamente após um boot do servidor (Y=sim, N=não).

Na linha 5 foi criada uma variável chamada FOUND que recebe o valor FALSE, que será usada para definir se o arquivo oratab foi ou não encontrado. Veremos esta variável novamente adiante.

A linha 6 inicia um desfio condicional (if) verificando se o número de argumentos enviados ao script ($#) é igual a 1 e, caso sim, define a variável ORACLE_SID com o valor do primeiro argumento passado para o script ($1).

Ainda dentro do desvio condicional, a linha 9 inicia um loop do tipo for onde ele inicia a variável oratab com o conteúdo da lista da variável oratab_list, ou seja, para cada entrada na lista oratab_list, será executada a repetição.

Para o primeiro valor da lista (/var/opt/oracle/oratab) um novo desvio condicional é iniciado (linha 11) onde será verificado se o arquivo armazenado na variável oratab (/var/opt/oracle/oratab) existe. No meu caso, o banco de dados está instalado em um sistema operacional Linux onde o arquivo oratab é o /etc/oratab. Portanto, nada será feito na primeira iteração do comando for pois o arquivo não será encontrado. Na segunda iteração, o arquivo será encontrado com sucesso e a variável FOUND receberá o valor TRUE (linha 12) e o laço de repetição será quebrado (linha 13).

É na linha 16 que "as coisas acontecem". Um novo desvio condicional é iniciado verificando se a variável FOUND possui o valor TRUE. Caso sim, na linha 17 é extraído, do arquivo oratab, o diretório de instalação do software do banco de dados para a instância especificada e armazenado na variável ORACLE_HOME. A linha 18 extrai um "pedaço" da variável ORACLE_HOME e armazena esta fração do diretório ORACLE_HOME como sendo o diretório base da instalação na variável ORACLE_BASE. Agora não será mais necessário extrair nada, basta apenas inicializar as variáveis com valores com base no ORACLE_HOME. As linhas 19 e 20 definem a localização em que o sistema operacional deverá encontrar as bibliotecas dinâmicas. No caso de HP-UX PA-RISC as bibliotecas são procuradas na variável SHLIB_PATH enquanto que Linux ou qualquer outro UNIX (incluindo HP-UX Itanium) a variável é a LD_LIBRARY_PATH.

...

Quer ler esse conteúdo completo? Tenha acesso completo