Undo segments

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic (Undo)
Voir aussi Undo contention · Undo users

Undo segments détaille chaque segment d'annulation actif : tablespace, extents initiaux/suivants, min/max extents, statut, taille occupée, nombre d'extents, ainsi que les compteurs de wraps (le segment a bouclé sur lui-même) et shrinks (le segment s'est réduit à sa taille optimale). Une somme par instance est calculée en pied de rapport. Le script interroge les vues GV$ et fonctionne aussi bien sur une instance unique qu'en RAC.

Utile pour dimensionner l'UNDO tablespace : des wraps fréquents combinés à des erreurs ORA-01555 (snapshot too old) indiquent un UNDO_RETENTION ou une taille de tablespace insuffisants pour la charge de rétention souhaitée.

Correction apportée : la jointure d'origine reliait dba_rollback_segs à dba_segments sur le seul nom de segment (segment_name), sans tenir compte du propriétaire (owner) — un risque de doublons en cas d'homonymie entre schémas. La jointure ci-dessous ajoute la condition sur owner.

Script

-- Détail des segments UNDO actifs : taille, wraps, shrinks, optimal size (RAC-compatible)
SET LINESIZE 180
SET PAGESIZE 50000
SET VERIFY OFF

COLUMN instance_name  FORMAT a9               HEADING 'Instance'
COLUMN undo_name      FORMAT a30              HEADING 'Undo Name'
COLUMN tablespace     FORMAT a11              HEADING 'Tablespace'
COLUMN in_extents     FORMAT a23              HEADING 'Init / Next Extents'
COLUMN m_extents      FORMAT a23              HEADING 'Min / Max Extents'
COLUMN status         FORMAT a8               HEADING 'Status'
COLUMN wraps          FORMAT 99,999           HEADING 'Wraps'
COLUMN shrinks        FORMAT 99,999           HEADING 'Shrinks'
COLUMN opt            FORMAT 999,999,999,999  HEADING 'Opt. Size'
COLUMN bytes          FORMAT 999,999,999,999  HEADING 'Bytes'
COLUMN extents        FORMAT 999              HEADING 'Extents'

BREAK ON instance_name SKIP 2
COMPUTE SUM LABEL 'Total: ' OF bytes ON instance_name

SELECT
    i.instance_name                     instance_name
  , a.owner || '.' || a.segment_name    undo_name
  , a.tablespace_name                   tablespace
  , TRIM(TO_CHAR(a.initial_extent, '999,999,999,999')) || ' / ' ||
    TRIM(TO_CHAR(a.next_extent,    '999,999,999,999'))          in_extents
  , TRIM(TO_CHAR(a.min_extents, '999,999,999,999')) || ' / ' ||
    TRIM(TO_CHAR(a.max_extents, '999,999,999,999'))             m_extents
  , a.status                            status
  , b.bytes                             bytes
  , b.extents                           extents
  , d.shrinks                           shrinks
  , d.wraps                             wraps
  , d.optsize                           opt
FROM
                gv$instance       i
    INNER JOIN  gv$rollstat       d ON (i.inst_id      = d.inst_id)
    INNER JOIN  sys.undo$         c ON (d.usn          = c.us#)
    INNER JOIN  dba_rollback_segs a ON (a.segment_name  = c.name)
    INNER JOIN  dba_segments      b ON (a.segment_name  = b.segment_name
                                     AND a.owner         = b.owner)
ORDER BY
    i.instance_name
  , a.segment_name;

Voir aussi

  • Undo contention — mesurer la contention induite par un sous-dimensionnement
  • Undo users — sessions consommant actuellement ces segments