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
- Identificar o
ospid
ouoracle_pid
da sessão - Conectar como SYSDBA no SQL*Plus
- Associar o processo:
oradebug setospid <ospid>
oradebug setorapid <oracle_pid>
- Congelar a sessão:
oradebug suspend
- 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