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_extentsGROUP BY tablespace_name, status;TABLESPACE_NAME STATUS Bytes(M)-------------------- --------- ----------UNDOTBS1 UNEXPIRED 9.1875UNDOTBS1 EXPIRED 13.6875 我们看一下查询的结果,UNEXPIRED 和EXPIRED 是已使用的undo 表空间,其中expired 说明是已经过期的数据,也就是15分钟(默认情况)以外的数据,以被覆盖,可以认为是空闲的。3 查询谁在使用undo 查看回滚段的统计信息:SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.statusFROM v$rollname n, v$rollstat sWHERE n.usn = s.usn;V$ROLLSTAT中的常用列
USN:回滚段标识 RSSIZE:回滚段默认大小 XACTS:活动事务数在一段时间内增量用到的列 WRITES:回滚段写入数(单位:bytes) SHRINKS:回滚段收缩次数 EXTENDS:回滚段扩展次数 WRAPS:回滚段翻转(wrap)次数 GETS:获取回滚段头次数 WAITS:回滚段头等待次数查看回滚段的使用情况,哪个用户正在使用回滚段的资源:select s.username, u.namefrom v$transaction t, v$rollstat r, v$rollname u, v$session swhere s.taddr = t.addr and t.xidusn = r.usn and r.usn = u.usnorder by s.username;可以根据此查询操作的内容进行处分析原因。也查以采用此情况直接Kill删除存在的事务
SQL> select count(*) from v$transaction;COUNT(*)---------- 5SQL> 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------------24509706163292146719335在主机上,kill掉对应的进程:$kill -9 24509$kill -9 706$kill -9 16329$kill -9 21467$kill -9 19335SQL> 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 数据不会覆盖