DBAtlas · Атлас эксплуатации баз данных

ORA-01555: Snapshot too old (Oracle)

Ошибка Oracle 'ORA-01555: snapshot too old' означает, что старые данные (undo), нужные запросу для согласованного чтения, уже перезаписаны. Это дерево сужает источник ошибки (долгий запрос + недостаточный UNDO, высокий оборот undo или LOB) и ведёт к правильному решению.

Где возникает ошибка?

Сначала определите контекст ошибки. Классическая ORA-01555 возникает во время долгого SELECT/отчёта или при обращении к столбцу LOB (CLOB/BLOB)? ORA-01555, связанная с LOB, — другой механизм (PCTVERSION/RETENTION) и решается отдельно.

SELECT sql_id, elapsed_time/1e6 AS sec, sql_text
FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;
  • Во время долгого запроса/отчёта
  • При обращении к столбцу LOB

Достаточен ли UNDO, подходит ли retention?

Долгий запрос читает из UNDO старый образ блоков, изменённых после его начала. Если табличное пространство UNDO мало или undo_retention короче длительности запроса, старый undo перезаписывается. Измерьте использование UNDO и retention.

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;
  • UNDO мал / retention короче запроса
  • UNDO достаточен, но фиксации очень частые
  • Запрос выполняется чрезмерно долго

Первопричина: недостаточный UNDO / retention

Старый undo, нужный долгому запросу, перезаписан, потому что истёк срок retention или заполнилось табличное пространство. Увеличьте UNDO и задайте retention, покрывающий длительность запроса.

Первопричина: высокий оборот undo (частые фиксации)

Интенсивный DML с очень частыми фиксациями быстро переиспользует блоки undo и стирает старый образ, нужный долгому запросу. Эффект 'commit cleanout' усугубляет это.

Первопричина: чрезмерная длительность запроса

Запрос выполняется так долго, что даже разумного undo_retention недостаточно. Постоянное решение — ускорить запрос или перенести его нагрузку.

Первопричина: LOB retention / PCTVERSION

ORA-01555 при чтении LOB означает, что пространства для хранения старых версий LOB (RETENTION или PCTVERSION) недостаточно. У LOB отдельный механизм версионирования.

Открыть в DBAtlas →