t。
3) 明确管理大事务的undo segment。
4) undo segment需求最小化。
5) 使用自动管理功能。
5.5.2.1 增加更多的undo segment
最好把新添加的undo segment放在另外的磁盘的表空间内。对undo要求最多的是delete,其次是update,最后是insert。
Oracle建议,为每4个并发事务创建一个undo segment,最多只能添加20个undo segment.
为了更准确的确定到底需要多大的undo segment,可以跟踪用户使用的undo segment大小:
//查询当前用户所使用的undo segment大小
SQL>select s.osuser,s.username,t.used_ublk
from v$session s,v$transaction t
where s.taddr = t.addr;
t.used_ublk:单位为Oracle块,*block size等于该用户将使用的size。
//查询某个大事务的具体使用大小。
1) 只保留一个undo segment online,其他的都offline。
Alter rollback segment xxxxx offline;
2) 统计当前所使用了的undo segment大小。
Select n.name,s.sun,s.writes from v$rollname n,v$rollstat s
Where n.usn = s.usn and name != ‘SYSTEM’;
s.writes:有多少字节的数据被写到该rollback segment上了。
3) 执行遇到回滚问题的大事务。
如:delete from alarminfo;
4) 重新执行“2)”的统计,使用新查询的s.writes减去(-)“2)”中查询出来的s.writes值,就是“3)”中事务所要使用的undo segment大小.
如果设置的undo segment大小是按大事务来设置,可能会浪费很多空间,只需要明确管理undo segment就可以了。
典型错误:ORA-01555 SNAPSHOT TOO OLD
一个修改事务很长时间未提交,别人查的时候在undo segment中找到了一个像前版本得到一致性读,别人还在查询到该修改前,最先修改的人提交了,并且此时undo segment中因为接受了commit而不守护该范围,此范围被其他事务写了。 www.2cto.com
这时候就会发生这种错误,只需要在查一次就可以了。
防范:
1) 表上发生小事务时候,设法避免运行时间很长的查询。
2) 增加undo segment的大小和数量。
一般设置:initial=512k,next=512k,minextents=20,这样就会创建一个10M的undo segment.
5.5.2.2 明确管理大事务的undo segment
创建一个很大的undo segment,专用于处理特定的事务.
由于Oracle会自动把任务分配给undo segment,所以一般创建完和使用完后,需要手工把他们offline.
1) 创建大回滚段.
Create private rollback segment rbs_for_large_tran
Storage (initial 10M next 10M) tablespace rbs;
2) 直到在作业开始前,把rbs_for_large_tran 联机.
Alter rollback segment rbs_for_large_tran online;
或:execute dbms_transaction.use_rollback_segment(‘rbs_for_large_tran’);
3) 启动作业.
Delete from alarminfo;
4) 一旦"3)"执行完,马上在另外一个窗口把该rbs_for_large_tran段offline.
Alter rollback segment rbs_for_large_tran offline;
注意:在作业中的任何commit,都将导致rbs_for_large_tran脱机.若脱机了,需重新联机.
5.5.2.3 undo segment需求最小化
最大限度的减少写往undo segment的项目数量和大小。
如:
imp的时候使用commit=y.
exp的时候不要使用consistent选项.
Sql*loader时设置适当的commit值.
5.5.2.4 使用自动管理功能
Oracle 9i的新功能,通过配置init.ora,让Oracle自动来进行管理undo segment(Oracle推荐)。
undo_managementl www.2cto.com
=auto //使用undo 自动管理(AUM)
=manual //不使用AUM。
l undo_retention
单位是秒.指定一个像前版本在commit后被保存的时间.(减少ORA-01555错误)
l undo_suppress_errors
FALSE,TRUE.指定是否抑制在RBU中可用的命令。
l undo_tablespace
指定用于AUM的表空间名.
(同一时间,只能有一个undo tablespace在线,也必须有一个undo tablespace在线.
如果
数据库未创建而undo_management=auto,则系统自动创建一个SYS_UNDOTBS表空间来使用)
创建的语法:
create undo tablespace undo_tbs
datafile ‘/u01/oradata/prod/undo01.dbf’ size 500M
autoextend on
next 5M maxsize 2000M;
(不能指定初始范围和下一个范围大小,因系统要自己指定)
估计undo tablespace大小的公式:
Undo space = (undo_retention * (undo blocks per second * db_block_size)) + db_block_size;
删除一个大的undo tbs:
8) 创建一个新的undo tbs undo_tbs02.
9) SQL>alter system setundo_tablespace=undo_tbs02;
此时,新的事务会使用undo_tbs02,而以前的事务,依然会继续使用undo_tbs.
10) 待Undo_tbs上的所有事务commit或rollback,且超过了undo_retention指定的时间后,drop tablespace删除该un