继续理解eygle深入浅出的undo回滚于撤销的重要细节知识点,先说一下以前blog中就提到的关于块清除的知识点。(块清除是个及其复杂的过程,这里因为个人理解只能整理出如下要点)
Ora-01555快照过久,oracle经典错误,主要由以下三种情况构成
1 查询scn小于block的scn需要undo构造cr块实现一致性读,回滚段被覆盖
2 延迟块清除,查询触发延迟块清除需要从回滚段获得事务提交的scn,如果事务前镜像已经被覆盖,并且查询scn小于回滚段中最小提交的scn,那么oracle将无法判断查询scn和事务提交scn大小,出现ora-01555(这里还说一下极端的情况,执行延迟块清除时,回滚段或原回滚表空间已经被删除,此时oracle还是可以通过字典表undo$来获得scn信息,执行块清除)
3 利用sqlldr的direct=true方式插入数据时,由于没有记录redo和undo信息,oracle直接指定cache commit scn给加载数据,访问这些数据时,可能会出现ora-01555
(对于eygle所述第三种情况,还未能理解清晰)
这里再说下分批提交:
对于一个大型事务由于要记录回滚段信息,当回滚段不足时很可能会出现一个大事务由于回滚段过久而直接失败,所以在大型事务中尽量使用分批提交减少回滚段的竞争。
Undo空间的记载,在oracle 9i自动管理的undo表空间,undo_retention参数的引入正是为了减少ora-01555错误出现,这个参数设置当transaction提交后,回滚段非激活后,回滚段保留的时间,oracle9IR1初始值为900秒,oracle9IR2增加10800秒,该参数越大,回滚段保留的时间也越长,不过也需要消耗相应的undo存储空间。
Undo_retention该参数并不是一个担保值,在事务比较频繁下,oracle很可能会覆盖在undo_retention之内的undo信息。
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10gEnterprise Edition Release 10.2.0.1.0 - Prod
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
oracle 10g下undo_retention会在AUM下自动管理,缺省会启用,oracle自动满足最大允许的长时间查询,而不需要设置undo_retention参数来保留undo信息。Oracle 10g的新特性的引入伴随着两个主要隐含参数_undo_autotune和_collect_undo_stats
SQL> col ksppinm for a20
SQL> col ksppdesc for a40
SQL> col ksppstvl for a10
SQL> select ksppinm,ksppdesc,ksppstvl from x$ksppi a,x$ksppcv b
2 where a.indx=b.indx and a.ksppinm like '%undo_autotune%';
KSPPINM KSPPDESC KSPPSTVL
-------------------- ---------------------------------------- ----------
_undo_autotune enable auto tuning of undo_retention TRUE
SQL> select ksppinm,ksppdesc,ksppstvl from x$ksppi a,x$ksppcv b
2 where a.indx=b.indx and a.ksppinm like '%collect_undo_stats%';
KSPPINM KSPPDESC KSPPSTVL
-------------------- ---------------------------------------- ----------
_collect_undo_stats Collect Statistics v$undostat TRUE
同样oracle 10g中增加了Guarantee控制,用户也可以指定undo表空间必须满足undo_retention的范围之内。默认的是noguarantee
SQL> select tablespace_name,status,contents,retention from dba_tablespaces where contents='UNDO';
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
UNDOTBS1 ONLINE UNDO NOGUARANTEE
SQL> alter tablespace undotbs1 retention guarantee;
Tablespace altered
SQL> select tablespace_name,status,contents,retention from dba_tablespaces where contents='UNDO';
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
UNDOTBS1 ONLINE UNDO GUARANTEE
当undo表空间设置为guarantee,提交事务的回滚空间必须被保留足够的时间,如果新的事务需要undo空间,此时不会覆盖und_retention范围之内的undo信息,事务会因为没有足够回滚空间而失败,而不是覆盖。
[@more@]
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1056956/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25362835/viewspace-1056956/