Undo 表空间
1.回退事务
2.读一致性
3.事务恢复
4.倒叙查询(FlashBack Query)
1先找到该表空间的物理位置,
Show parameter undo_tablespace。SQL> select name from v$tablespace;
select file_name, bytes / 1024 / 1024 / 1024
  from dba_data_files
 where tablespace_name like 'UNDOTBS%';

 2 查询SELECT   tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)"
    FROM   dba_undo_extents
GROUP BY   tablespace_name, status;

TABLESPACE_NAME      STATUS      Bytes(M)
-------------------- --------- ----------
UNDOTBS1             UNEXPIRED     9.1875
UNDOTBS1             EXPIRED      13.6875
 我们看一下查询的结果,UNEXPIRED 和EXPIRED 是已使用的undo 表空间,其中expired 说明是已经过期的数据,也就是15分钟(默认情况)以外的数据,以被覆盖,可以认为是空闲的。
3 查询谁在使用undo 
查看回滚段的统计信息:
SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status
FROM v$rollname n, v$rollstat s
WHERE n.usn = s.usn;

V$ROLLSTAT中的常用列
             USN:回滚段标识
             RSSIZE:回滚段默认大小
             XACTS:活动事务数
在一段时间内增量用到的列
       WRITES:回滚段写入数(单位:bytes)
       SHRINKS:回滚段收缩次数
       EXTENDS:回滚段扩展次数
       WRAPS:回滚段翻转(wrap)次数
       GETS:获取回滚段头次数
       WAITS:回滚段头等待次数
查看回滚段的使用情况,哪个用户正在使用回滚段的资源:
select s.username, u.name
from v$transaction t, v$rollstat r, v$rollname u, v$session s
where s.taddr = t.addr
   and t.xidusn = r.usn
   and r.usn = u.usn
order by s.username;
可以根据此查询操作的内容进行处分析原因。
也查以采用此情况直接Kill

删除存在的事务
SQL> select count(*) from v$transaction;
COUNT(*)
----------
         5
SQL> select p.SPID from v$session s,v$process p where s.PADDR=p.ADDR and s.SID in (select s.sid From v$transaction t,v$session s where t.addr=s.taddr);
SPID
------------
24509
706
16329
21467
19335
在主机上,kill掉对应的进程:
$kill -9 24509
$kill -9 706
$kill -9 16329
$kill -9 21467
$kill -9 19335
SQL> select count(*) from v$transaction;
COUNT(*)
----------
         0

处理方法 1 处理方法有两种,一是添加undo 表空间的数据文件,二是切换UNDO tablespace. 这种情况下多用在undo 表空间已经非常大的情况。

undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖