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.