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.