-------设定是否可以覆盖没有过期的块 alter database undo undotbs_name retention noguarantee/guarantee; select a.END_TIME, UNDOBLKS /*消耗undo块总和*/, MAXQUERYLEN /*最长查询时间*/, MAXQUERYID /*最长查询sql_id*/, TXNCOUNT /*总事务量*/, a.EXPSTEALCNT /*偷窃过期区次数*/, a.EXPBLKRELCNT /*偷窃成功的块数*/, a.EXPBLKREUCNT /*同回滚段中重用过期块数*/, a.UNXPSTEALCNT /*偷窃未过期块次数*/, a.UNXPBLKRELCNT /*偷窃成功未过期块数*/, a.UNXPBLKREUCNT /*重用未过期块数*/ from v$undostat a; ---------------undo膨胀问题分析 with tab_min_extend as (select distinct b.SEGMENT_NAME, b.TABLESPACE_NAME, min(b.EXTENT_ID) over(partition by b.SEGMENT_NAME, b.TABLESPACE_NAME) min_extend, b.STATUS from dba_undo_extents b where b.STATUS <> 'EXPIRED'), tab_sge_size as (select distinct d.SEGMENT_NAME, d.TABLESPACE_NAME, sum(d.BYTES) over(partition by d.SEGMENT_NAME, d.TABLESPACE_NAME) seg_size from dba_undo_extents d), tab_sge_unused as (select distinct a.SEGMENT_NAME, a.TABLESPACE_NAME, sum(a.bytes) over(partition by a.SEGMENT_NAME, a.TABLESPACE_NAME) as sge_unused from dba_undo_extents a, tab_min_extend c, tab_sge_size e where a.SEGMENT_NAME = c.SEGMENT_NAME and a.TABLESPACE_NAME = c.TABLESPACE_NAME and a.EXTENT_ID < c.min_extend) select roll.usn,al.TABLESPACE_NAME, al.SEGMENT_NAME, al.seg_size, un.sge_unused from tab_sge_size al, tab_sge_unused un,v$rollname roll where al.SEGMENT_NAME = un.SEGMENT_NAME(+) and al.TABLESPACE_NAME = un.TABLESPACE_NAME(+) and al.SEGMENT_NAME=roll.name order by roll.usn; -----undo表空间使用情况 (如果used_rag>60%需要查具体是哪个进程) set linesize 200 col used_pct format a8 select b.tablespace_name, nvl(used_undo,0) "USED_UNDO(M)", total_undo "Total_undo(M)", trunc(nvl(used_undo,0) / total_undo * 100, 2) || '%' used_PCT from (select nvl(sum(bytes / 1024 / 1024), 0) used_undo, tablespace_name from dba_undo_extents where status = 'ACTIVE' group by tablespace_name) a, (select tablespace_name, sum(bytes / 1024 / 1024) total_undo from dba_data_files where tablespace_name in (select value from v$spparameter where name = 'undo_tablespace' and (sid = (select instance_name from v$instance) or sid = '*')) group by tablespace_name) b where a.tablespace_name (+)= b.tablespace_name / --注:包含UNEXPIRED类型 (主要是用这个) select b.tablespace_name, nvl(used_undo,0) "USED_UNDO(M)", total_undo "Total_undo(M)", trunc(nvl(used_undo,0) / total_undo * 100, 2) || '%' used_PCT from (select nvl(sum(bytes / 1024 / 1024), 0) used_undo, tablespace_name from dba_undo_extents where status in ( 'ACTIVE','UNEXPIRED') group by tablespace_name) a, (select tablespace_name, sum(bytes / 1024 / 1024) total_undo from dba_data_files where tablespace_name in (select value from v$spparameter where name = 'undo_tablespace' and (sid in (select instance_name from gv$instance) or sid = '*')) group by tablespace_name) b where a.tablespace_name (+)= b.tablespace_name / SELECT tablespace_name, status, SUM(bytes) / 1024 / 1024/1024 size_gb FROM dba_undo_extents WHERE tablespace_name LIKE 'UNDOTBS%' GROUP BY tablespace_name, status ORDER BY 1 / ---------回滚段等待比率大于1% SELECT decode(r1.hwmsize, NULL, drs.segment_name || ' (Offline)', drs.segment_Name) "Rollback Segment Name", COUNT(ds.SEGMENT_NAME) "Segment Count", r1.HWMSIZE "High Water Mark", r1.OptSize "Optimal Size", r1.Shrinks "Shrinks", r1.AveShrink "Average Shrink", r1.AveActive "Avg Active Size", r1.Wraps "Wraps", r1.Extends "Extends", r1.gets "Gets", r1.waits "Waits", Round((r1.Waits * 100 / r1.Gets), 2) "Wait Ratio (%)", drs.tablespace_name "Tablespace", drs.initial_extent "Extent Size" FROM sys.dba_segments ds, Sys.V_$Rollstat r1, sys.dba_rollback_segs drs WHERE r1.usn(+) = drs.segment_id AND drs.segment_name = ds.segment_name AND ds.segment_type = 'ROLLBACK' AND Round((r1.Waits * 100 / r1.Gets), 2) > 1 GROUP BY r1.hwmsize, drs.segment_name, r1.OptSize, r1.Shrinks, r1.AveShrink, r1.AveActive, r1.Wraps, r1.Extends, r1.gets, r1.waits, drs.tablespace_name, drs.initial_extent ORDER BY 3; -----各个session使用的undo set linesize 1000 pagesize 500 col rollname for a25 col db_os_term_gram for a50 col sid_serial_spid for a20 col sql_id for a15 col COMMAND_NAME for a15 col SELECT_DATE for a15 col undo_kb for 999999999 col login_time for a20 col last_txn for a20 col trans_starttime for a30 SELECT r.name rollname, nvl(s.SCHEMANAME, 'None') || '/' || s.osuser || '/' || s.TERMINAL || '/' || s.PROGRAM db_os_term_gram, s.sid||'/'|| s.serial#||'/'||p.spid sid_serial_spid, s.sql_id,/* (select COMMAND_NAME from v$sqlcommand comm where s.COMMAND = comm.COMMAND_TYPE) COMMAND_NAME,*/ t.used_ublk * TO_NUMBER(x.value) / 1024 AS undo_kb, TO_CHAR(s.logon_time, 'yy/mm/dd hh24:mi:ss') AS login_time, TO_CHAR(SYSDATE - (s.last_call_et) / 86400, 'yy/mm/dd hh24:mi:ss') AS last_txn, t.START_TIME trans_starttime FROM v$process p, v$rollname r, v$session s, v$transaction t, v$parameter x WHERE s.taddr = t.addr AND s.paddr = p.addr AND r.usn = t.xidusn(+) AND x.name = 'db_block_size' --and s.sid in (1908,960,1387,1448) ORDER BY undo_kb DESC;