Monitorando Recursos no Oracle: Sessões e Processos com Alertas Automatizados

Sergio BenderSergio Bender
4 min read

No gerenciamento de bancos de dados Oracle, acompanhar o uso de recursos como sessões (sessions) e processos (processes) é essencial para garantir a estabilidade e evitar erros como "ORA-00020: maximum number of processes exceeded".

Neste artigo, apresento uma query SQL simples para verificar o uso desses recursos e sugiro como transformá-la em um monitoramento automatizado que registra alertas no alert log quando o uso ultrapassa 80%.

Script SQL que você pode executar para obter uma visão instantânea dos recursos:

    SELECT RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, LIMIT_VALUE
    FROM V$RESOURCE_LIMIT
    WHERE RESOURCE_NAME IN ('sessions', 'processes');

O Que Ela Faz?

Essa query consulta a visão dinâmica v$resource_limit, que fornece informações sobre os limites de recursos do banco. Ela filtra apenas sessions e processes, retornando:

  • RESOURCE_NAME: Nome do recurso (sessions ou processes).

  • CURRENT_UTILIZATION: Uso atual do recurso.

  • MAX_UTILIZATION: Pico de uso desde a última inicialização.

  • LIMIT_VALUE: Limite máximo configurado (definido pelos parâmetros sessions e processes).

A subquery é opcional neste caso, mas mantém a estrutura flexível para expansões futuras (ex.: adicionar filtros ou joins).

Exemplo de Saída

Ao executar, você pode ver algo assim:

RESOURCE_NAME  CURRENT_UTILIZATION  MAX_UTILIZATION  LIMIT_VALUE
-------------  -------------------  --------------  -----------
processes      150                  200             300
sessions       280                  300             330

Nesse exemplo fictício:

  • processes: 150 em uso, pico de 200, limite de 300.

  • sessions: 280 em uso, pico de 300, limite de 330.

Por Que Isso é Útil?

  1. Visão Rápida: Mostra o estado atual e histórico de sessions e processes.

  2. Planejamento: O MAX_UTILIZATION ajuda a decidir se os limites precisam ser ajustados.

  3. Diagnóstico: Se usuários relatam falhas de conexão, você pode verificar se os recursos estão esgotados.

Como Usar?

Execute a query como um usuário com acesso à v$resource_limit (ex.: DBA ou com SELECT_CATALOG_ROLE). Os resultados aparecem diretamente no console da sua ferramenta (SQL*Plus, SQL Developer, etc.).

Interpretando os Resultados
  • CURRENT_UTILIZATION alto: Se está perto de LIMIT_VALUE (ex.: 280/330 = 84,8% para sessions), o banco pode estar próximo de um gargalo.

  • MAX_UTILIZATION no limite: Indica que o recurso já foi totalmente utilizado em algum momento.

  • Ação: Aumente os parâmetros (ex.: ALTER SYSTEM SET processes=400 SCOPE=SPFILE;) se necessário, seguido de um restart.

Sugestão: Monitoramento Automatizado com Alert Log

Para transformar essa query em um monitoramento proativo, você pode criar um job no Oracle Scheduler que roda a cada 15 minutos, verifica se o uso ultrapassa 80% do limite e registra um alerta no alert log do banco. Aqui está como fazer isso:

Passo 1: Criar o Procedimento

Crie um procedimento PL/SQL que verifica os recursos e escreve no alert log usando DBMS_SYSTEM.KSDWRT:

CREATE OR REPLACE PROCEDURE check_resource_limits AS
BEGIN
    FOR rec IN (
        SELECT RESOURCE_NAME, CURRENT_UTILIZATION, LIMIT_VALUE
        FROM V$RESOURCE_LIMIT
        WHERE RESOURCE_NAME IN ('sessions', 'processes')
    ) LOOP
        IF rec.current_utilization > (rec.limit_value * 0.8) THEN
            -- Escreve no alert log (nível 2 = mensagem de alerta)
            DBMS_SYSTEM.KSDWRT(2, 'ALERTA: ' || rec.resource_name || 
                               ' está acima de 80% do limite! Uso: ' || 
                               rec.current_utilization || '/' || rec.limit_value || 
                               ' em ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS'));
        END IF;
    END LOOP;
END;
/
Passo 2: Criar o Job no Scheduler

Agende o procedimento para rodar a cada 15 minutos:

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
        job_name        => 'MONITOR_RESOURCE_LIMITS',
        job_type        => 'STORED_PROCEDURE',
        job_action      => 'CHECK_RESOURCE_LIMITS',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'FREQ=MINUTELY;INTERVAL=15',
        enabled         => TRUE,
        comments        => 'Monitora sessions e processes a cada 15 minutos'
    );
END;
/
Como Funciona?
  • O job executa o procedimento check_resource_limits a cada 15 minutos.

  • Se CURRENT_UTILIZATION exceder 80% de LIMIT_VALUE, uma mensagem é escrita no alert log do banco (ex.: alert_<SID>.log), que fica no diretório definido pelo parâmetro diagnostic_dest.

  • Exemplo de entrada no alert log:

      Fri Mar 28 14:30:00 2025
      ALERTA: sessions está acima de 80% do limite! Uso: 280/330 em 28-MAR-2025 14:30:00
    
Verificando o Alert Log
  • Localize o alert log com:

      SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';
    
  • Abra o arquivo (ex.: alert_ORCL.log) e procure pelas mensagens de alerta.

Benefícios do Monitoramento

  • Proatividade: Detecta problemas antes que os limites sejam atingidos.

  • Histórico: O alert log mantém um registro permanente para análise posterior.

  • Automação: Não exige intervenção manual após configurado.

Conclusão

Essa query simples é um ponto de partida excelente para monitorar sessions e processes, e com o job sugerido, você transforma um diagnóstico manual em um sistema de alerta automatizado. Configure o monitoramento no seu ambiente e fique tranquilo sabendo que o alert log vai te avisar se algo estiver fora do normal. Testou? Compartilhe nos comentários como você monitora recursos no seu banco!

0
Subscribe to my newsletter

Read articles from Sergio Bender directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sergio Bender
Sergio Bender