OLATOracle Log Analysis Tool Abrir a ferramenta
AtençãoLocks

ORA-00054

Recurso ocupado (NOWAIT)

O ORA-00054 (“resource busy and acquire with NOWAIT specified or timeout expired”) aparece quando um comando DDL tenta obter um lock exclusivo sobre um objeto que está sendo usado por outra sessão.

Por padrão, comandos DDL no Oracle não esperam: eles tentam obter o lock imediatamente e, se não conseguem, falham. É por isso que o erro costuma surgir justamente quando se tenta alterar uma tabela em horário de movimento.

A boa notícia é que existem duas saídas simples: descobrir e tratar quem está segurando o objeto, ou instruir o DDL a esperar um tempo pelo lock em vez de falhar de imediato.

O que significa

DDL tentou lock exclusivo num objeto em uso — o DDL falha imediatamente por padrão.

Como o erro aparece

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

Passo a passo do diagnóstico consultas somente leitura

Descubra quem está segurando o objeto

SELECT o.object_name, o.object_type,
       s.sid, s.serial#, s.username, s.osuser, s.machine, s.program,
       s.status, s.last_call_et AS segundos_no_estado
  FROM v$locked_object l
  JOIN dba_objects o ON o.object_id = l.object_id
  JOIN v$session  s ON s.sid = l.session_id
 ORDER BY s.last_call_et DESC;

Faça o DDL esperar em vez de falhar imediatamente

Esta é a solução mais elegante para janelas de manutenção: o comando entra na fila e aguarda o tempo definido.

Definir tempo de espera para o DDL na sessão

ALTER SESSION SET DDL_LOCK_TIMEOUT = 60;

Para tabelas muito movimentadas, prefira operações ONLINE

ALTER INDEX meu_indice REBUILD ONLINE;

Ação imediata

Encontre quem usa o objeto ou use janela/timeout.

Correção definitiva

ALTER SESSION SET DDL_LOCK_TIMEOUT=30 (espera em fila em vez de falhar); operações ONLINE (rebuild/redef) para objetos quentes.

Como prevenir

DDL em janela; DDL_LOCK_TIMEOUT como padrão de sessão de deploy.

Erros comuns — o que não fazer

  • Matar a sessão bloqueadora sem verificar o que ela está fazendo. Se for uma transação longa e legítima, o rollback pode demorar mais do que a espera — e ainda gerar impacto no negócio.
  • Repetir o DDL em laço até “pegar”. Além de ineficiente, aumenta a chance de você conseguir o lock justamente no meio de uma operação crítica da aplicação.
  • Executar DDL em horário de pico. Boa parte dos ORA-00054 desaparece simplesmente ao mover a alteração para uma janela de menor movimento.

Perguntas frequentes

O que significa o erro ORA-00054 no Oracle?

Significa que um comando DDL tentou obter um lock exclusivo sobre um objeto que estava em uso por outra sessão. Como o DDL não espera por padrão, ele falha imediatamente em vez de aguardar a liberação.

Como evitar o ORA-00054 ao alterar uma tabela?

Definindo um tempo de espera para o DDL com ALTER SESSION SET DDL_LOCK_TIMEOUT, executando a alteração em janela de menor movimento ou utilizando operações ONLINE quando disponíveis para o comando desejado.

Erros relacionados (Locks)

Vinicius Gabriel Lana

Vinicius Gabriel Lana

Sócio & CTO na MigraTI Soluções em TI · 8 anos como DBA (Oracle, SQL Server, PostgreSQL, MySQL)