DBAtlas · Atlas de operações de banco de dados

ORA-01555: Snapshot too old (Oracle)

O erro 'ORA-01555: snapshot too old' do Oracle indica que os dados antigos (undo) de que uma consulta precisa para uma leitura consistente já foram sobrescritos. Esta árvore restringe a origem do erro (consulta longa + UNDO insuficiente, alta rotatividade de undo ou LOB) e leva você à correção certa.

Onde o erro ocorre?

Primeiro determine o contexto do erro. O ORA-01555 clássico ocorre durante um SELECT/relatório de longa duração ou ao acessar uma coluna LOB (CLOB/BLOB)? O ORA-01555 relacionado a LOB é um mecanismo diferente (PCTVERSION/RETENTION) e é resolvido separadamente.

SELECT sql_id, elapsed_time/1e6 AS sec, sql_text
FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;
  • Durante uma consulta/relatório de longa duração
  • Ao acessar uma coluna LOB

O UNDO é suficiente, a retenção é adequada?

Uma consulta longa lê do UNDO a imagem antiga dos blocos alterados desde que ela começou. Se o UNDO tablespace for pequeno ou undo_retention for menor que a duração da consulta, o undo antigo é sobrescrito. Meça o uso do UNDO e a retenção.

SHOW PARAMETER undo_retention;
SELECT tablespace_name, SUM(bytes)/1024/1024 AS mb, status
FROM dba_undo_extents GROUP BY tablespace_name, status;
SELECT MAX(maxquerylen) AS longest_query_sec, MAX(tuned_undoretention) AS tuned_retention
FROM v$undostat;
  • O UNDO é pequeno / retenção menor que a consulta
  • O UNDO é suficiente, mas os commits são muito frequentes
  • A consulta roda por tempo excessivo

Causa raiz: UNDO / retenção insuficiente

O undo antigo necessário para a consulta longa foi sobrescrito porque o período de retenção expirou ou o tablespace encheu. Aumente o UNDO e defina a retenção para cobrir a duração da consulta.

Causa raiz: alta rotatividade de undo (commits frequentes)

DML pesado com commits muito frequentes recicla os blocos de undo rapidamente e apaga a imagem antiga de que a consulta longa precisa. O efeito 'commit cleanout' piora isso.

Causa raiz: duração excessiva da consulta

A consulta roda por tanto tempo que nem um undo_retention razoável é suficiente. A correção definitiva é acelerar a consulta ou descarregar sua carga.

Causa raiz: retenção de LOB / PCTVERSION

O ORA-01555 ao ler um LOB indica que o espaço que guarda as versões antigas do LOB (RETENTION ou PCTVERSION) é insuficiente. Os LOBs têm um mecanismo de versionamento separado.

Abrir no DBAtlas →