traceudump2.sql

----------------------------------
-- SCRIPT  traceudump2.sql
-- INICO DO SCRIPT 
-- ALEXANDRE PIRES 14/05/2012
----------------------------------
rem ---
rem traceUdump2.sql
rem
rem Comments:   Copia um arquivo de trace de user_dump_dest.
rem             para um diretorio de destino especificado.
rem             Funciona tanto em databases UNIX como Windows.
rem             Para Oracle 7.3 e superiores.
rem
rem Required:   * utl_file_dir deve conter background_dump_dest
rem             * parametro user_dump_dest deve ser um diretorio completo,
rem               tais como '?/rdbms/log' ou '%RDBMS73%' etc
rem
rem Author:     Laurent Baylac
rem             http://www.dba-village.com/village/dvp_papers.PaperDetails?PaperIdA=2383
rem
rem 14/05/2012 ALEXANDRE PIRES
rem ---

define p_SPID=&1
define p_TRC_ID=&2
variable g_NumLinhas number
variable g_ErrMsg varchar2(255)
column pTraceFileName new_value pTraceFileName

DECLARE

   ----------------------------------------------------------------------
   --- Variaveis para o arquivo de trace em user_dump_dest
   ----------------------------------------------------------------------
   vSID            v$database.name%type;   /* nome do database */
   vWindows        pls_integer;            /* identifica se servidor usa Windows ou nao */
   vTraceDir       v$parameter.value%type; /* diretorio do TRACE FILE */
   vTraceName      varchar2(250);          /* nome real do arquivo TRACE FILE */
   vTraceFileId    utl_file.file_type;     /* ID de arquivo para o TRACE FILE */
   ----------------------------------------------------------------------
   --- Variaveis para a copia do arquivo
   ----------------------------------------------------------------------
   vDestDir        v$parameter.value%type  /* diretorio para copia do TRACE FILE */
                   := '\\SPBdev01\Public\ORACLEIO\TRANSF\trace';
   vDestName       varchar2(250);          /* nome real do arquivo TRACE FILE */
   vDestFileId     utl_file.file_type;     /* ID de arquivo para o TRACE FILE */
   ----------------------------------------------------------------------
   --- Outras variaveis
   ----------------------------------------------------------------------
   vEOF            boolean := false;       /* variavel para identificar fim do arquivo */
   vTexto          varchar2(32000);        /* Texto de uma linha do TRACE FILE */
   vNumLinhas      pls_integer := 0;       /* Numero de linhas ja lidas */
   ----------------------------------------------------------------------
   --- Funcao para testar se o arquivo existe
   ----------------------------------------------------------------------
   function arquivoExiste
           ( pDiretorio      varchar2
           , pArquivo        varchar2
           )
   return boolean as
      vArquivoId             utl_file.file_type;
   begin
      vArquivoId := utl_file.fopen
                       ( location   => pDiretorio
                       , filename   => pArquivo
                       , open_mode  => 'r'
                       );
      utl_file.fclose( file => vArquivoId );
      return TRUE;
   exception
   when others then
       return FALSE;
   end arquivoExiste;
   ----------------------------------------------------------------------

BEGIN

   ----------------------------------------------------------------------
   -- Determina o nome do database
   ----------------------------------------------------------------------
   select name
     into vSID
     from v$database;

   ----------------------------------------------------------------------
   -- Determina em que diretorio esta o TRACE FILE
   ----------------------------------------------------------------------
   select value
     into vTraceDir
     from v$parameter
     where name = 'user_dump_dest';

   ----------------------------------------------------------------------
   -- Determina o sistema operacional do servidor
   ----------------------------------------------------------------------
   select count(*)
     into vWindows
     from v$version
     where banner like '%Windows%';

   ----------------------------------------------------------------------
   -- Determina o nome do TRACE FILE baseado no sistema operacional
   ----------------------------------------------------------------------
   if vWindows = 0 then
      /* O servidor nao e' Windows, nome provavelmente em minusculas */
      vTraceName := 'ora' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..trc';
   else
      /*
      || O servidor e' Windows. Acredite se quiser, mas tem que testar
      || nomes com maiusculas e minusculas...
      */
      if   -- Primeiro tenta nome e extensao em maiusculas
         arquivoExiste( vTraceDir, 'ORA' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..TRC' )
            then vTraceName := 'ORA' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..TRC';
      elsif -- Agora tenta nome e extensao em minusculas
         arquivoExiste( vTraceDir, 'ora' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..trc' )
            then vTraceName := 'ora' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..trc';
      elsif -- Tenta nome em maiusculas e extensao em minusculas
         arquivoExiste( vTraceDir, 'ORA' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..trc' )
            then vTraceName := 'ORA' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..trc';
      else  -- Sobrou apenas nome em minusculas e extensao em maiusculas
         vTraceName := 'ora' || lpad( &p_SPID, 5, '0') || '_&p_TRC_ID..TRC';
      end IF;
   end if;

   ----------------------------------------------------------------------
   -- Abre o arquivo TRACE FILE
   ----------------------------------------------------------------------
   begin
      vTraceFileId := utl_file.fopen
                      ( location => vTraceDir
                      , filename => vTraceName
                      , open_mode => 'r'
                      , max_linesize => 32000
                      );
      dbms_output.put_line( chr(10) || 'Abrindo arquivos...' );
      dbms_output.put_line( '==> origem : ' || vTraceDir ||'\'||vTraceName );
   exception
      when utl_file.invalid_mode then
         raise_application_error
         ( -20001, 'string de OPEN_MODE invalida');

   end;

   ----------------------------------------------------------------------
   -- Determina o onde ficara' a copia do trace file
   ----------------------------------------------------------------------
   vDestName       := vTraceName;

   ----------------------------------------------------------------------
   -- Abre o arquivo de copia do TRACE FILE
   ----------------------------------------------------------------------
   begin
      vDestFileId := utl_file.fopen
                      ( location => vDestDir
                      , filename => vDestName
                      , open_mode => 'w'
                      , max_linesize => 32000
                      );
      dbms_output.put_line( '==> destino: ' || vDestDir ||'\'||vDestName);
   exception
      when utl_file.invalid_mode then
         raise_application_error
         ( -20009, 'string de OPEN_MODE invalida');

   end;

   ----------------------------------------------------------------------
   -- Processa todas as linha do TRACE FILE
   ----------------------------------------------------------------------
   while not vEOF
   loop
      -------------------------------------------------------------------
      --- Tenta ler uma linha do arquivo
      -------------------------------------------------------------------
      begin
         utl_file.get_line( vTraceFileId, vTexto );
         vNumLinhas := vNumLinhas + 1;
      exception
         -----------------------------
         when NO_DATA_FOUND then
            vEOF := TRUE;
         -----------------------------
         when VALUE_ERROR then
            utl_file.fclose_all;
            raise_application_error
            ( -20002, 'Linha muito longa para armazenar na variavel');
         -----------------------------
         when UTL_FILE.INVALID_OPERATION then
            utl_file.fclose_all;
            raise_application_error
            ( -20003, 'arquivo nao aberto para leitura');
         -----------------------------
         when UTL_FILE.READ_ERROR then
            vTexto := 'Linha ' || vNumLinhas
                   || ': ocorreu um erro no SO durante a leitura';
      end;

      -------------------------------------------------------------------
      --- Faz o output da linha
      -------------------------------------------------------------------
      utl_file.put_line( vDestFileId, vTexto );

   end loop;

   ----------------------------------------------------------------------
   -- Fecha o arquivo TRACE FILE
   ----------------------------------------------------------------------
   dbms_output.put_line( chr(10) || 'Fechando arquivos...' );
   dbms_output.put_line( '==> origem : ' || vTraceDir ||'\'||vTraceName );
   utl_file.fclose( file => vTraceFileId);
   dbms_output.put_line( '==> destino: ' || vDestDir ||'\'||vDestName);
   utl_file.fclose( file => vDestFileId);
   :g_NumLinhas := vNumLinhas;

exception
   -----------------------------
   when UTL_FILE.INVALID_PATH then
      dbms_output.put_line
      ( 'Encontrado erro UTL_FILE.INVALID_PATH. ' ||
        'Verifique o parametro de inicializacao UTL_FILE_DIR.'
      );
   -----------------------------
   when UTL_FILE.INVALID_OPERATION then
      if vTraceDir like '%$%'
      or vTraceDir like '%?%'
      or vTraceDir like '%\%%' escape '\'
      then
         dbms_output.put_line
         ( 'Nao pode abrir o TRACE FILE. ' ||
           'Verifique o parametro de inicializacao BACKGROUND_DUMP_DEST' ||
            vTraceDir || '.'
         );
      else
         dbms_output.put_line
         ( 'Encontrado erro UTL_FILE.INVALID_OPERATION.');
      end if;
   -----------------------------
   when OTHERS then
      :g_NumLinhas := vNumLinhas;
      :g_ErrMsg := SQLERRM;
END;
/

column "Mensagem de erro" format a70
select :g_NumLinhas as "NumLinhas"
     , :g_ErrMsg as "Mensagem de erro"
from dual
/
----------------------------------
-- FIM DO SCRIPT  -- 

Sobre Alexandre Pires

ORACLE OCS Goldengate Specialist, OCE RAC 10g R2, OCP 12C, 11g, 10g , 9i e 8i - Mais de 25 anos de experiência na área de TI. Participei de projetos na G&P alocado na TOK STOK, EDINFOR alocado na TV CIDADE "NET", 3CON Alocado no PÃO DE AÇUCAR, DISCOVER alocado na VIVO, BANCO IBI e TIVIT, SPC BRASIL, UOLDIVEO alocado no CARREFOUR e atualmente na ORACLE ACS atendendo os seguintes projetos: VIVO, CLARO, TIM, CIELO, CAIXA SEGUROS, MAPFRE, PORTO SEGURO, SULAMERICA, BRADESCO SEGUROS, BANCO BRADESCO, BASA, SANTANDER, CNJ, TSE, ELETROPAULO, EDP, SKY, NATURA, ODEBRESHT, NISSEI, SICREDI, CELEPAR, TAM, TIVIT, IBM, SMILES, CELEPAR, SERPRO,OKI,BANCO PAN, etc
Esse post foi publicado em ORACLE 11gR2, PLSQL SCRIPTS, PLSQL TUNING e marcado , , . Guardar link permanente.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s