Oracle Undo management
> 10g with Tunded undo management - compute size of undo :
SELECT (UR * (UPS * DBS))/1024/1024 AS "Bytes" FROM (select max(tuned_undoretention) AS UR from v$undostat), (SELECT undoblks/((end_time-begin_time)*86400) AS UPS FROM v$undostat WHERE undoblks = (SELECT MAX(undoblks) FROM v$undostat)), (SELECT block_size AS DBS FROM dba_tablespaces WHERE tablespace_name = (SELECT UPPER(value) FROM v$parameter WHERE name = 'undo_tablespace'));
Active transactions with undo and rollback segments :
col o format a10 col u format a10 select osuser o, username u, sid, segment_name s, substr(sa.sql_text,1,200) txt from v$session s, v$transaction t, dba_rollback_segs r, v$sqlarea sa where s.taddr=t.addr and t.xidusn=r.segment_id(+) and s.sql_address=sa.address(+) And substr(sa.sql_text,1,200) is not null order by 3; col name format a8 col username format a8 col osuser format a8 col start_time format a17 col status format a12 tti 'Active transactions' select username, osuser, t.start_time, r.name, t.used_ublk "ROLLB BLKS", decode(t.space, 'YES', 'SPACE TX', decode(t.recursive, 'YES', 'RECURSIVE TX', decode(t.noundo, 'YES', 'NO UNDO TX', t.status) )) status from sys.v_$transaction t, sys.v_$rollname r, sys.v_$session s where t.xidusn = r.usn and t.ses_addr = s.saddr /
Tivoli monitoring query for Undo utilization :
set LINESIZE 132; col "NAME" format A80 col "Free %" format 999 col "Size [MB]" format 999999999 col "Used [MB]" format 999999999 select 'SPACE:' || a.tablespace_name "NAME", sum(a."MB") "Size [MB]", sum(nvl(b."MB", 0)) "Used [MB]" , (sum(a."MB") - sum(nvl(b."MB", 0))) / sum(a."MB") * 100 "Free %" from (select tablespace_name, sum(bytes)/1024/1024 "MB" from dba_data_files df where exists (select 1 from dba_undo_extents where tablespace_name = df.tablespace_name) group by tablespace_name) a, (select tablespace_name, sum(bytes)/1024/1024 "MB" from dba_undo_extents where status = 'ACTIVE' group by tablespace_name) b where a.tablespace_name = b.tablespace_name (+) group by a.tablespace_name order by "Free %" desc;
Recommended UNDO size :
set linesize 300 col "UNDO RETENTION [Sec]" for a30 SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]", SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]", (TO_NUMBER(e.value) * TO_NUMBER(f.value) * g.undo_block_per_sec) / (1024*1024) "NEEDED UNDO SIZE [MByte]" FROM ( SELECT SUM(a.bytes) undo_size FROM v$datafile a, v$tablespace b, dba_tablespaces c WHERE c.contents = 'UNDO' AND c.status = 'ONLINE' AND b.name = c.tablespace_name AND a.ts# = b.ts# ) d, v$parameter e, v$parameter f, ( SELECT MAX(undoblks/((end_time-begin_time)*3600*24)) undo_block_per_sec FROM v$undostat ) g WHERE e.name = 'undo_retention' AND f.name = 'db_block_size' /