Social Icons

21 de fev de 2017

Escrevendo no alert.log com PL/SQL


 
Olá pessoal,

     No artigo de hoje vou mostrar como escrever no alert.log com apenas uma linha de código, dentro de um bloco PL/SQL. Um procedimento simples e muito útil!
  
     A ideia de escrever este artigo surgiu semana passada quando fui revisar uma rotina de manutenção semanal que criei há alguns anos atrás nos BDs de produção que administro, que entre diversas tarefas de manutenção do BD, possui uma rotina que executa a limpeza de dados antigos do repositório do Statspack (assunto que vou abordar nos próximos artigos do blog), e nessa rotina (um Stored Procedure) existe um código PL/SQL para escrever uma mensagem no alert.log, ao final dela, indicando que a limpeza foi executada com sucesso!

     O alert.log contém mensagens de registros e de erros, em ordem cronológica, de vários eventos importantes que ocorrem no BD, tais corrompimento de datafiles, erros internos, erros de deadlock e operações administrativas tais como: STARTUP, SHUTDOWN, ARCHIVE LOG e RECOVER. Por que então não adicionar ali, algumas mensagens também importantes, de rotinas de manutenção criadas por nós DBAs?
  
     O código é muito simples e pode ser utilizado em qualquer rotina (importante) de manutenção do BD. Há aproximadamente 1 mês atrás, um amigo do grupo DBA BRASIL me disse que havia criado uma rotina para coletar estatísticas de alguns objetos que não estavam sendo atualizados pelo processo de coleta de estatísticas automáticas do Oracle, e ele disse que estava gravando um log desse processo manual de coleta de estatísticas, em um arquivo texto do SO, através do package UTL_FILE. Eu informei a ele que havia uma maneira muito mais simples de registrar esse evento, gravando-o no alert.log, através do procedimento que vou mostrar abaixo.

     Para gravar uma mensagem no alert.log, basta executar a procedure KSDWRT do package DBMS_SYSTEM, passando 2 valores para os seus parâmetros:
          - O 1º parâmetro indica o(s) arquivo(s) destino da mensagem e aceita 1 de 3 valores:
               a) 1 para escrever no trace file;
               b) 2 para escrever no alert.log;
               c) 3 para escrever em ambos.
          - O 2º parâmetro indica a mensagem que deverá ser escrita no(s) arquivo(s) indicado(s) no valor do parâmetro anterior.

     Segue abaixo um exemplo de bloco PL/SQL que pode ser usado para escrever uma mensagem no alert.log: 
begin
     sys.dbms_system.ksdwrt(2, 'TESTE');
end;

     Um detalhe importante é que não precisamos nos preocupar em informar data/hora em que a mensagem foi gravada, pois o Oracle já insere automaticamente a data/hora dos eventos no alert.log, conforme podemos observar na imagem abaixo:



     O package DBMS_SYSTEM contém outras rotinas que podem ser úteis em diversas ocasiões, como por exemplo, para ler variáveis de ambiente do SO (DBMS_SYSTEM.GET_ENV()). Entretanto, tome cuidado com o seu uso, pois a Oracle informa que não dá suporte no uso deste package e que ele deverá ser usado somente pela equipe de suporte dela.

     Veja abaixo mais detalhes sobre o package DBMS_SYSTEM, que encontrei no doc "How To Edit, Read, and Query the Alert.Log" (ID 1072547.1), do MOS:

NOTE about DBMS_SYSTEM:
This package should in fact only be installed when requested by Oracle Support. 
It is not documented in the server documentation.
As such the package functionality may change without notice.
It is to be used only as directed by Oracle Support and its use otherwise is not supported.

Per internal Note 153324.1:
Generally, if a package is not in the Oracle documentation at all, it is intentional, as it is not for end user use. Non-documented packages should be avoided by customers unless specifically instructed to use them by either
Oracle Support or Oracle Development.




Finished here!
Espero que o artigo lhe seja útil!
[]s
   

0 comentários:

Postar um comentário

 

Suporte remoto alunos

Seguidores

Meu One Drive (antigo Sky Drive)