Picture of Roberto Sobrinho
Roberto Sobrinho

18/06/2025

Oracle: Congelar Sessão Sem Kill Session com Oradebug

Sessões que consomem muitos recursos no Oracle podem comprometer a performance de todo o ambiente. A solução mais comum seria matar a sessão com ALTER SYSTEM KILL SESSION. Mas e se ela estiver rodando um processo crítico? Finalizar pode gerar perda de dados, reprocessamento e impacto em outras áreas.

Nessas horas, o comando oradebug suspend permite congelar a sessão de forma segura, pausando a execução sem encerrar. Depois, é só usar oradebug resume para retomar normalmente.

Quando usar oradebug suspend

O comando oradebug suspend é útil quando uma sessão está atrapalhando o desempenho do banco, mas não pode ser encerrada. Alguns exemplos:

  • Sessão com alto consumo de CPU ou I/O, impactando outras atividades
  • Job crítico em execução, que não pode ser perdido ou reiniciado
  • Processo travado ou em loop, mas que precisa ser analisado depois
  • Situação emergencial, onde liberar recursos rapidamente é prioridade

1 – Localizar a sessão com alto consumo

Conecte-se como SYSDBA e execute a consulta:

SQL>
SET LINESIZE 200
SET PAGESIZE 50
COLUMN sid FORMAT 9999
COLUMN serial# FORMAT 99999
COLUMN ospid FORMAT A10
COLUMN oracle_pid FORMAT 999
COLUMN username FORMAT A15
COLUMN cpu_usage FORMAT 9999999999
SQL>
SELECT s.sid, s.serial#, p.spid AS ospid, p.pid AS oracle_pid, s.username, ss.value AS cpu_usage
    FROM v$session s
    JOIN v$process p ON s.paddr = p.addr
    JOIN v$sesstat ss ON s.sid = ss.sid
    JOIN v$statname sn ON ss.statistic# = sn.statistic#
    WHERE sn.name = 'CPU used by this session'
      AND s.username IS NOT NULL
      AND s.status = 'ACTIVE'
    ORDER BY ss.value DESC;

  SID|SERIAL#|OSPID     |ORACLE_PID|USERNAME       |  CPU_USAGE
-----|-------|----------|----------|---------------|-----------
  467|   9870|30361     |       108|SYS            |     140939
  322|  15258|30359     |       102|SYS            |     138196
  328|  25992|4459      |       117|SOE            |        305
  468|  52867|4470      |       123|SOE            |        304
  627|  60500|4435      |        64|SOE            |        302
  178|  34656|4443      |        96|SOE            |        290
   35|   2761|4481      |       130|SOE            |        270
  174|  56276|4455      |       116|SOE            |        268
   34|  61309|4472      |       125|SOE            |        262
  315|   9686|4445      |        97|SOE            |        234
  311|  62234|4285      |        62|SYS            |         74
  450|  15690|26267     |        13|SYS            |          2

12 rows selected.

SQL>

Escolha a sessão que apresenta o maior valor na coluna CPU_USAGE. Essa é a sessão que mais está consumindo CPU no momento. Ela aparece nas primeiras linhas do resultado da query. Use os valores de OSPID ou ORACLE_PID dessa linha nos próximos comandos para congelar e, depois, retomar a execução da sessão com o oradebug.

2 – Associar o processo ao oradebug

Conecte-se como SYSDBA:

SQL> --## Usando o PID do sistema operacional (OSPID) ##
SQL> oradebug setospid 30361
Oracle pid: 108, Unix process pid: 30361, image: oracle@srvora2.localdomain (J001)
SQL>

SQL> --## Ou usando o PID interno do Oracle (ORACLE_PID): ##
SQL> oradebug setorapid 108
Oracle pid: 108, Unix process pid: 30361, image: oracle@srvora2.localdomain (J001)
SQL>

3 – Congelar a Sessão

Conecte-se como SYSDBA:

SQL>
SQL> oradebug suspend
Statement processed.
SQL>

A sessão é interrompida no exato ponto em que estiver. Se estiver executando um PL/SQL em loop, por exemplo, o código para na linha atual e fica em espera. Nada mais é processado: nem comandos SQL, nem chamadas PL/SQL, nem transações são concluídas.

Se a sessão estiver com uma transação aberta e sem commit, ela continua “pendente”, mas não avança nem grava nada e o LGWR para de receber dados dessa sessão.

Durante o tempo em que estiver suspensa:

  • Não consome CPU
  • Não gera I/O
  • Não responde a comandos enviados por outra interface
  • Continua ocupando memória e mantendo locks

Essa pausa é total e invisível para o usuário da sessão, que só notará que a execução está travada.

Ao executar o oradebug resume, a sessão continua exatamente do ponto em que foi congelada inclusive loops, cursores ou transações parciais. Nenhuma informação é perdida e nenhum erro é gerado.

4 – Retomar a sessão

oracle@srvora2[V01] ~]# sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jun 18 13:26:34 2025
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>  oradebug setorapid 108
Oracle pid: 108, Unix process pid: 30361, image: oracle@srvora2.localdomain (J001)
SQL>
SQL> oradebug resume
Statement processed.
SQL>
SQL>

Esse comando faz a sessão voltar exatamente do ponto em que foi congelada.
Se a sessão estava dentro de um loop, um procedimento ou executando uma query pesada, ela continua normalmente do momento em que parou como se tivesse sido colocada em pause e depois play.
Nenhum erro ocorre, nenhuma transação é perdida, e o usuário da sessão normalmente nem percebe que foi pausado.

Importante: se você sair do SQL*Plus ou perder a conexão com a instância antes de executar o resume, será necessário associar novamente o processo com oradebug setospid ou setorapid.
Só depois disso será possível retomar a execução da sessão.

4 – Resumão Para Congelar Sessão

  1. Identificar o ospid ou oracle_pid da sessão
  2. Conectar como SYSDBA no SQL*Plus
  3. Associar o processo:
    • oradebug setospid <ospid>
    • oradebug setorapid <oracle_pid>
  1. Congelar a sessão:
    • oradebug suspend
  1. Retomar a sessão:
    • oradebug resume

Se fechar o SQL*Plus antes do resume, precisa setar o processo de novo.

e zas


#20250618 #DBASobrinho #GuinaNãoTinhaDó #BóBó #CaceteDeAgulha #OracleACE #NildolaSeFoi #VixNãoSei #PlimPlim


Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print

Pesquisar

Roberto Sobrinho

Sou Roberto Fernandes Sobrinho, também conhecido como Sobrinho DBA , pós graduado em “Architecture and Database Administration”, entusiasta, dedicado e com 20 anos de experiência com Oracle Database e suas diversas distribuições e variações.

Oracle ACE Associate

2025

Specialist

Exadata Database Machine X9M

Professional

Oracle Database Administration

Professional

Oracle Database 19c: RAC, ASM, & Grid Infra Administrator

Professional

Oracle Autonomous Database Cloud

Professional

Oracle Cloud Database Migration and Integration

Professional

Oracle Database PL/SQL Developer

Associate

Oracle Cloud Infrastructure Architect

Associate

Oracle Cloud Infrastructure Foundations

Categorias

Categorias

Tags

Oracle: Congelar Sessão Sem Kill Session com Oradebug