Undo Tablespace Usage

Das UNDO-Management ist zentraler Bestandteil für die Sicherstellung der Lesekonsistenz der Oracle-Datenbank. Eigentlich eine gute Sache, aber manchmal hat man auch damit zu kämpfen. Hier ein paar hilfreiche Abfragen, die beim Troubleshooting unterstützen.

-- Auslastung/Belegung des Undo Tablespaces anzeigen

SELECT 
  CASE 
    WHEN STATUS='EXPIRED' THEN 'EXPIRED (reusable)' 
    WHEN STATUS='UNEXPIRED' THEN 'UNEXPIRED (read consistency, emergency reuse)'
    WHEN STATUS='ACTIVE' THEN 'ACTIVE (open transactions)' 
    ELSE STATUS 
  END AS STATUS,
  TO_CHAR(ROUND(SUM(bytes) / (1024*1024), 0),  '9G999G990') || ' MB' AS SIZE_MB
FROM 
  dba_undo_extents
GROUP BY 
  status
UNION
SELECT 
  'FREE (usable)' AS STATUS,
  TO_CHAR(ROUND((tbs.undo_size- ext.sum_bytes) / (1024*1024), 0), '9G999G990') || ' MB' AS SIZE_MB
FROM
  (SELECT SUM(bytes) sum_bytes FROM dba_undo_extents) ext,
  (SELECT SUM(a.bytes) undo_size FROM dba_tablespaces c
     JOIN v$tablespace b ON b.name = c.tablespace_name
     JOIN v$datafile a ON a.ts# = b.ts#
   WHERE c.contents = 'UNDO'
     AND c.STATUS = 'ONLINE'
  ) tbs;
-- Belegung des Undo Tablespaces durch User anzeigen

SELECT 
  s.sid,
  s.username,
  TO_CHAR(ROUND(SUM(ss.value) / 1024 / 1024, 2), '9G999G990D99') || ' MB' AS SIZE_MB
FROM  v$sesstat ss
  JOIN v$session s ON s.sid = ss.sid
  JOIN v$statname stat ON stat.statistic# = ss.statistic#
WHERE 
  stat.name = 'undo change vector size'
  AND s.type <> 'BACKGROUND'
  AND s.username IS NOT NULL
GROUP BY 
  s.sid,
  s.username
ORDER BY 
  3 DESC;