oracle undo表空间

1说明
   在对数据进行修改时,数据库会生成undo信息,以便回到更改前的状态,这是通过多版本控制支持中实现的,当执行DML操作时,事务操作前数据被称为undo记录如果执行的事务或语句由于某种原因失败了,或者用一条rollback语句请求回滚,就可以利用这些信息将数据放回到修改前的样子。
Undo在数据库中存储子一组特殊的段中,称为undo段。回滚段由范围组成,这个范围由五个或五个以上的oralce块组成。通常对undo有一个误解,认为undo用于将数据库物理的恢复到执行语句或事物之前的样子,但实际上并非如此,数据库只是逻辑的恢复到原来的样子,所有的修改都被逻辑的取消,对于每个操作如insert,回滚后相当于做了delete相反操作。

2 特点及作用
特点:
1、是数据修改前的备份,主要是保护用户的读一致性。
2、在事务修改数据时产生。
3、至少保存到事务结束。

作用:
1、回滚(rollback)操作。
2、实现读一致性与闪回查询。
3、从失败的事务中还原数据。
4、非正常停机后的实例恢复。

3 工作方式
1、在一个回滚段内,以环形方式循环使用,直到段装满,由用户的commit或rollback命令发布后释放回滚段内的范围。
2、同一个undo segment可以存储很多个像前版本,同时,一个像前版本只会存储在一个undo segment而不会因空间等任何问题连续到其他的undo segment。
3、如果一个undo segment中的一个范围启动了一个事物的像前版本,且逐渐增长装满了该范围,此时会环绕到下一个临近的范围继续使用空间,此时如果下一个临近范围已经被其他事物占领,则绝对不会跳过该临近范围而查找其他的可用范围,而是会在这个范围之间创建一个新的范围来使用。
4、一个undo segment能处理事务的个数,取决于oracle块的大小。
5、每个数据库至少有一个回滚段(系统回滚段),一旦创建了其他回滚段,则该回滚段将只用于处理数据目录读一致性和事务控制。
6、Set transaction use riilback segment命令可以申请一个指定的回滚段。
7、LOB列不适用undo segment,而使用创建时分配给表的空间来存储像前版本。

4 优化undo segment
优化目标:
1、用户不用等待,就始终可找到undo segment来使用。
2、用户始终能得到完成事务所需要的读一致性视图。
3、回滚段不会引起过多的I/O。
一般就是;
1、消除对undo segment header或block的争用。
2、尽量最小化undo segment的扩充和环绕。
3、避免undo  segment用尽。
4、始终拥有为用户提供一致性视图的undo segment。
做法:
1、添加更多的undo segment。
2、增大现有undo segment。
3、明确管理大事务undo segment。
4、Undo segment需求最小化。
5、使用自动管理功能。

5 生成undo大小
   如果表存在索引(或者实际上表就是索引组织表),这将显著地影响生成的undo量,因为索引是一种复杂的数据结构,可能会生成相当多的undo信息。
1、insert生成undo最少,oracle所需记录只是删除一个rowid(行ID)。
2、update排名第二(大多数情况下),只需记录修改的字符。
3、delete生成的undo最多,必须把整行的前映像记录到undo中

解决ora-01555办法
1、适当的设置参数undo_retention(要大于执行运行时间最长的事务所需的时间),可以用v$undostat undostat来确定长时间运行的查询的持续时间。另外要确保磁盘上已经预留了足够的空间。
2、使用手动管理undo时增大或增加更多的回滚段。这样在长时间运行的查询语句期间,覆盖undo的数据可能性就能降低。
3、减少查询的运行时间(调优)

6 参数
使用show parameter undo查看undo参数设置。
1、UNDO_MANAGEMENT
值为AUTO是自动管理,MANUAL手动 管理。

2、UNDO_TABLESPACE
指定数据库使用特定的undo表空间。

4、UNDO_RETENTION
保存undo信息的最少时间。
不存在理想的UNDO_RETENTION的时间间隔。保留时间间隔依赖于估计最长的事务可能运行的时间长度。根据数据库中最长事务长度的信息,可以给UNDO_RETENTION分配一个大致的时间。

7 相关SQL语句
1、查看当前用户使用的undo segment大小
select s.osuser,s.username,t.used_ublk
  from v$session s,v$transaction t
     where s.taddr = t.addr;
2、创建undo表空间
create undo tablespace undo02
datafile 'D:\oracle\product\oradata\orcl\un dotbs02.dbf'
size 10M autoextend on next 30G maxsize 500M;
3、修改系统undo表空间
alter system set undo_tablespace='undo02' scope=both;

猜你喜欢

转载自gip666.iteye.com/blog/1830522