OLATOracle Log Analysis Tool Abrir a ferramenta
AtençãoEspaço/Undo

ORA-01555

Snapshot too old (leitura consistente perdida)

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 COMMIT dentro 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 pelo UNDO_RETENTION do 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.

Erros relacionados (Espaço/Undo)

Vinicius Gabriel Lana

Vinicius Gabriel Lana

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