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.