ORA-01555
Snapshot too old (leitura consistente perdida)
⚠ Pontos de atenção antes de executar
Atenção ao RETENTION GUARANTEE: com ele o Oracle passa a preferir FALHAR operações de DML a sobrescrever undo ainda não expirado. Você pode trocar o ORA-01555 por ORA-30036 e interromper a gravação da aplicação. Se for usar, dimensione o undo com folga e monitore o espaço.
O ORA-01555 (“snapshot too old: rollback segment number X with name ... too small”) é um dos erros mais mal compreendidos do Oracle, porque o nome sugere um problema de tamanho — e a causa raiz quase nunca é só isso.
O Oracle garante leitura consistente: uma consulta enxerga os dados como estavam no instante em que começou, mesmo que outras sessões alterem esses dados durante a execução. Para isso ele reconstrói as versões antigas dos blocos usando as informações do undo.
O ORA-01555 acontece quando a sua consulta precisou de uma versão antiga de um bloco, foi buscá-la no undo, e aquela informação já tinha sido sobrescrita por outra transação. Ou seja: é um conflito entre uma consulta longa e a taxa de reciclagem do undo.
O que significa
O undo necessário para reconstruir a versão antiga do dado foi sobrescrito — query longa + undo pequeno/retention baixa, ou fetch across commit (cursor aberto commitando no meio).
Como o erro aparece
ORA-01555: snapshot too old: rollback segment number 8 with name "_SYSSMU8_2932610509$" too small
Passo a passo do diagnóstico consultas somente leitura
Anote a duração da consulta que falhou e o horário
Esse é o dado mais importante para dimensionar corretamente. O undo precisa reter informação por mais tempo do que dura a sua consulta mais longa.
Compare a consulta mais longa com a retenção efetiva de undo
SELECT TO_CHAR(begin_time,'DD/MM HH24:MI') inicio,
maxquerylen AS consulta_mais_longa_seg,
tuned_undoretention AS retencao_efetiva_seg,
undoblks, ssolderrcnt AS erros_1555
FROM v$undostat
ORDER BY begin_time DESC;Interprete o resultado
Se maxquerylen for maior que tuned_undoretention, você tem a explicação do erro: existem consultas rodando por mais tempo do que o undo consegue reter. A coluna ssolderrcnt mostra quantos ORA-01555 ocorreram naquele intervalo.
Verifique o tamanho e o autoextend do undo tablespace
SELECT tablespace_name, SUM(bytes)/1024/1024 mb, COUNT(*) arquivos,
MAX(autoextensible) autoextend
FROM dba_data_files
WHERE tablespace_name = (SELECT value FROM v$parameter WHERE name='undo_tablespace')
GROUP BY tablespace_name;Ação imediata
Anote a duração da query que falhou e o horário — é a chave do dimensionamento.
Correção definitiva
Aumentar UNDO_RETENTION junto com o tamanho do undo tablespace (um sem o outro não resolve); otimizar a query longa; eliminar fetch across commit.
Como prevenir
Undo dimensionado pela query mais longa; relatórios pesados em standby/Active Data Guard.
Nota de versão
Para LOBs SECUREFILE, ajustar RETENTION do LOB (o undo do LOB fica no próprio segmento).
Erros comuns — o que não fazer
- Apenas aumentar o UNDO_RETENTION. O parâmetro sozinho não garante nada: se o undo tablespace não tiver espaço, o Oracle sobrescreve mesmo assim. Retenção e tamanho precisam andar juntos.
- Ativar RETENTION GUARANTEE sem avaliar o impacto. Com essa opção, o Oracle passa a preferir falhar o DML a sobrescrever undo não expirado. Você troca o ORA-01555 por um ORA-30036 (“unable to extend segment in undo tablespace”) e pode derrubar a gravação da aplicação inteira. Use somente com o undo bem dimensionado e monitorado.
- Ignorar o padrão fetch across commit: abrir um cursor, percorrê-lo e dar
COMMITdentro do laço. Esse é um dos maiores geradores de ORA-01555 — e a correção é na aplicação, não no banco. - Tratar ORA-01555 em LOB como se fosse igual. Para colunas LOB, a retenção é controlada no próprio segmento do LOB (cláusula
RETENTION/PCTVERSION), não peloUNDO_RETENTIONdo banco.
Perguntas frequentes
O que causa o erro ORA-01555?
Uma consulta longa precisou de uma versão antiga de um bloco para manter a leitura consistente, mas a informação de undo correspondente já havia sido sobrescrita por outras transações. É um conflito entre a duração da consulta e a reciclagem do undo.
Aumentar o undo tablespace resolve o ORA-01555?
Ajuda, mas raramente é a solução completa. É preciso alinhar o tamanho do undo tablespace com o parâmetro UNDO_RETENTION e, principalmente, revisar consultas muito longas e padrões como o fetch across commit na aplicação.
RETENTION GUARANTEE é seguro para resolver ORA-01555?
É eficaz, mas tem um efeito colateral sério: o Oracle passa a preferir falhar operações de DML a sobrescrever undo ainda não expirado, o que pode gerar ORA-30036 e interromper gravações. Só deve ser usado com o undo bem dimensionado e monitorado.