Rastreando uma sessão de outro usuário

O Oracle possui várias formas de se rastrear uma conexão e saber o que está ocorrendo por lá. Você pode utilizar gatilhos (particularmente os gatilhos de sistema são muito interessantes) pode utilizar o comando AUDIT, pode utilizar o TRACE e a versão 10g traz recursos ainda mais sofisticados para rastrear suas aplicações. Se você está procurando por problemas de performance, provavelmente o TRACE será uma boa opção, pois traz para você o resultado dos planos de consulta da sessão sem você ter de conhecer muitos detalhes sobre como ele funciona.

Rastrear uma sessão é bastante simples, o problema é que muitas vezes eu preciso rastrear a conexão de uma aplicação de terceiros, onde eu não tenho acesso ao código fonte da aplicação. Em geral, eu preciso fazer isso num ambiente de produção, portanto rastrear todas as conexões do banco de dados é absolutamente proibitivo! Em resumo, preciso rastrear um sessão que não é minha. Como a documentação do Oracle é um pouco vaga neste ponto específico, achei melhor documentar o processo.

Vejamos como fazer:

  1. Conheça os parâmetros de inicialização:
    Existem alguns parâmetros que devem ser ajustados/conhecidos antes de se utilizar o TRACE Você pode dar uma olhada em quais valores estão ativos no momento utilizando a visão v$parameter.

    1. STATISTICS_LEVEL: Se você ajustar este parâmetro para ‘ALL’ estará automaticamente rastreando todas as sessões (não recomendado em ambiente de produção) além de uma série de outras estatísticas. O valor padrão é ‘TYPICAL’ e não costuma ser uma boa idéia alterar este valor na inicialização. No entanto, você pode utilizar o comando ALTER SESSION para ativar a coleta de estatísticas apenas na sua sessão. Se quiser saber afinal o que muda se você alterar este parâmetro, veja a visão v$statistics_level.
    2. SQL_TRACE: Este parâmetro está em desuso e não deve ser utilizado. Ele também ativa o rastreamento dos comandos SQL, mas existem formas mais elegantes de se fazer isso;
    3. TIMED_STATISTICS: Este sim é o parâmetro que nos interessa! Mas é a forma mais utilizada para rastrear uma conexão. No entanto, há apenas um detalhe… você só pode alterar o seu valor para uma instancia ou para a sua própria sessão (assim como o SQL_TRACE e o STATISTICS_LEVEL).
    4. MAX_DUMP_FILE_SIZE: Este parâmetro é importante pois ele limita o tamanho dos seus arquivos gerados pelo rastreamento. Vale a pena conferir para ver se ele atende às suas necessidades. O valor padrão é ilimitado, mas se você pensa em deixar o rastreamento ativado por longos períodos, é bom pensar num limite razoável.
    5. USER_DUMP_DEST: Este parâmetro diz em qual local os arquivos de rastreamento serão criados. O valor padrão é ‘$ORA_HOME/admin/$ORA_SID/udump/’ mas você pode altera-lo, principalmente se precisar de mais espaço em disco.
  2. Descubra qual é a sessão que você deseja rastrear:
    Para isso faça com que a aplicação se conecte e saiba qual é o usuário utlizado pela aplicação e rode o seguinte script:
    SELECT sid, serial#, username FROM v$session WHERE username = 'FOO';
    Você utilizará o ‘sid’ e o ‘serial#’ para ativar e desativar o rastreamento.
  3. Ative o rastreamento:
    Se você deseja ativar o rastreamento da sua própria sessão, um simples
    ALTER SESSION SET SQL_TRACE = TRUE;
    é suficiente. Para alterar outra sessão se conecte como sysdba e rode o seguinte comando:
    EXEC sys.dbms_system.set_sql_trace_in_session(sid,serial#,TRUE);
    substituindo ‘sid’ e ‘serial#’ pelos valores obtidos pelo select anterior e ‘foo_trace’ por uma string a ser utilizada para nomear o arquivo gerado.
  4. Libere o usuário para realizar as ações que você deseja rastrear;
  5. Rode o comando a seguir para terminar o rastreamento:
    EXEC sys.dbms_system.set_sql_trace_in_session(sid,serial#,FALSE);
  6. Procure na pasta indicada pelo parâmetro ‘USER_DUMP_DEST’ . Podem haver vários arquivos lá, então tente encontrar o arquivo referente ao seu rastreamento pela data;
  7. Rode na linha de comando do seu SO o comando tkprof para formatar a saida para um formato mais legível:
    $ tkprof arquivo_trace arquivo_final.txt
    onde ‘arquivo_trace’ é o nome do arquivo gerado pelo rastreamento e ‘arquivo_final.txt’ é o arquivo a ser criado com o resultado do rastreamento formatado.

Deixe um comentário

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