DBAtlas · Atlas d'exploitation des bases de données

ORA-01555 : Snapshot too old (Oracle)

L'erreur Oracle 'ORA-01555: snapshot too old' indique que les anciennes données (undo) dont une requête a besoin pour une lecture cohérente ont déjà été écrasées. Cet arbre affine l'origine de l'erreur (longue requête + UNDO insuffisant, rotation rapide de l'undo, ou LOB) et vous mène à la bonne correction.

Où l'erreur se produit-elle ?

Déterminez d'abord le contexte de l'erreur. L'ORA-01555 classique survient-elle pendant un SELECT/rapport long, ou lors de l'accès à une colonne LOB (CLOB/BLOB) ? L'ORA-01555 liée aux LOB relève d'un mécanisme différent (PCTVERSION/RETENTION) et se résout séparément.

SELECT sql_id, elapsed_time/1e6 AS sec, sql_text
FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;
  • Pendant une requête/un rapport long
  • Lors de l'accès à une colonne LOB

L'UNDO est-il suffisant, la rétention est-elle appropriée ?

Une longue requête lit dans l'UNDO l'ancienne image des blocs modifiés depuis son démarrage. Si le tablespace UNDO est petit ou que undo_retention est plus court que la durée de la requête, l'ancien undo est écrasé. Mesurez l'utilisation de l'UNDO et la rétention.

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;
  • L'UNDO est petit / la rétention est plus courte que la requête
  • L'UNDO est suffisant mais les commits sont très fréquents
  • La requête dure excessivement longtemps

Cause racine : UNDO / rétention insuffisant(e)

L'ancien undo nécessaire à la longue requête a été écrasé car la période de rétention a expiré ou le tablespace s'est rempli. Agrandissez l'UNDO et réglez la rétention pour couvrir la durée de la requête.

Cause racine : rotation rapide de l'undo (commits fréquents)

Des DML intensifs avec des commits très fréquents recyclent rapidement les blocs d'undo et effacent l'ancienne image dont la longue requête a besoin. L'effet 'commit cleanout' aggrave la situation.

Cause racine : durée de requête excessive

La requête dure si longtemps que même un undo_retention raisonnable ne suffit pas. La correction durable consiste à accélérer la requête ou à déporter sa charge.

Cause racine : rétention LOB / PCTVERSION

Une ORA-01555 lors de la lecture d'un LOB indique que l'espace contenant les anciennes versions du LOB (RETENTION ou PCTVERSION) est insuffisant. Les LOB ont un mécanisme de versionnage distinct.

Ouvrir dans DBAtlas →