Oracle数据库回滚段专题Word下载.docx
《Oracle数据库回滚段专题Word下载.docx》由会员分享,可在线阅读,更多相关《Oracle数据库回滚段专题Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
需要注意的是,使用第二个语句对数据库的并发性和性能将带来影响。
回滚段的种类
系统回滚段:
当数据库创建后,将自动创建一个系统回滚段,该回滚段只用于存放系统表空间中对象的前影像,比如数据字典。
非系统回滚段:
拥有多个表空间的数据库至少应该有一个非系统回滚段,用于存放非系统表空间中对象的数据前影像。
非系统回滚段又分为私有回滚段和公有回滚段,私有回滚段应在参数文件的ROLLBACKSEGMENTS参数中列出,以便例程启动时自动使其在线(ONLINE)。
公有回滚段一般在OPS(ORACLE并行服务器)中出现,将在例程启动时自动在线。
DEFERED回滚段:
当我们把一个表空间置于Offline状态后,由于表空间此时不能进行读写,这个时候如果有用户执行Rollback命令要把相关此表空间上数据的事务进行回滚,"
RollbackCompleted."
消息会返回给用户,此时,对于用户而言事务已经回滚,但是对于DB而言,回滚并没有真正的完成,这个时候数据库将该回滚信息写入系统回滚段(也就是延迟回滚段),等表空间重新Online的时候,数据库从系统回滚段中将回滚信息应用
回滚段的使用
分配回滚段:
当事务开始时,ORACLE将为该事务分配回滚段,并将拥有最少事务的回滚段分配给该事务。
事务可以用以下语句申请指定的回滚段:
SETTRANSTRACTIONUSEROLLBACKSEGMENTrollback_segment
事务将以顺序,循环的方式使用回滚段的区(EXTENTS),当当前区用满后移到下一个区。
几个事务可以写在回滚段的同一个区,但每个回滚段的块只能包含一个事务的信息。
例如(两个事务使用同一个回滚段,该回滚段有四个区):
1、事务在进行中,它们正在使用回滚段的第三个区;
2、当两个事务产生更多的回滚信息,它们将继续使用第三个区;
3、当第三个区满后,事务将写到第四个区,当事务开始写到一个新的区时,称为翻转(WRAP);
4、当第四个区用满时,如果第一个区是空闲或非活动(使用该区的所有事务完成而没有活动的事务)的,事务将接着使用第一个区。
回滚段的扩张(EXTEND)
当当前回滚段区的所有块用完而事务还需要更多的回滚空间时,回滚段的指针将移到下一个区。
当最后一个区用完,指针将移到第一个区的前面。
回滚段指针移到下一个区的前提是下一个区没有活动的事务,同时指针不能跨区。
当下一个区正在使用时,事务将为回滚段分配一个新的区,这种分配称为回滚段的扩展。
回滚段将一直扩展到该回滚段区的个数到达回滚段的参数MAXEXTENTS的值时为止。
SQL>
createrollbacksegmentun_do1tablespaceun_dostorage(initial100knext100kminextents10maxextents100optimal1000k);
不要设置MAXEXTENTS为UNLIMITED
OPTIMAL参数来节约空间的使用
从Oracle9i开始,Oracle引入了自动管理的Undo表空间,如果选择使用自动的Undo表空间的管理,那么用户不再能够创建或删除回滚段,也不再需要为事务指定回滚段,这一切将由Oracle自动进行。
showparameterundo
NAMETYPEVALUE
-----------------------------------------------------------------------------
undo_managementstringAUTO
undo_retentioninteger900
undo_tablespacestringUNDOTBS1
想使用手动管理回滚段?
selectname,isses_modifiable,issys_modifiablefromv$parameterwherenamelike'
%undo
%'
;
NAME
--------------------------------------------------------------------------------
ISSESISSYS_MOD
--------------
undo_management
FALSEFALSE
undo_tablespace
FALSEIMMEDIATE
undo_retention
不支持直接修改回滚段参数
altersystemsetundo_management=manualscope=spfile;
系统已更改。
startupforce
ORACLE例程已经启动。
undo_managementstringMANUAL
现在回滚段属于手动管理状态
createrollbacksegmentun_do1tablespaceun_dostorage(initial100knext100kminex
tents10maxextents100optimal1000k);
createrollbacksegmentun_do1tablespaceun_dostorage(initial100knext100kminextents
10maxextents100optimal1000k)
*
第1行出现错误:
ORA-30574:
无法利用AUTO段空间管理在表空间中创建回退段
不能在使用自动段空间上使用建立回滚段
createtablespaceuuuddatafile'
E:
\oracle\product\10.2.0\oradata\ORACLE\DATAFILE\uuu
d.dbf'
size10mextentmanagementlocaluniformsegmentspacemanagementmanual;
表空间已创建。
建立手动段空间
createrollbacksegmentud1tablespaceuuudstorage(initial100knext100kminextents10maxextents100optimal1000k);
createrollbacksegmentud1tablespaceuuudstorage(initial100knext100kminextents10
maxextents100optimal1000k)
ORA-01593:
回退段最佳大小(125blks)小于计算的初始大小(130blks)
初始区100k,最小10个区,而回滚段最佳大小事1000k,小于回滚段最小空间,所以报错
createrollbacksegmentud1tablespaceuuudstorage(initial100knext100kminextents10maxextents100optimal1100k);
maxextents100optimal1100k)
ORA-01552:
非系统表空间'
UUUD'
不能使用系统回退段
非系统永久表空间不能使用回滚段
createundotablespaceuuuuddatafile'
\oracle\product\10.2.0\oradata\ORACLE\DATAFILE\uuuud.dbf'
size10mRETENTIONNOGUARANTEE;
createrollbacksegmentud1tablespaceuuuudstorage(initial100knext100kminexten
ts10maxextents100optimal1100k);
回退段已创建。
如果系统表空间使用本地管理表空间,其余表空间只能使用本地管理表空间
如果系统表空间使用字典管理表空间,其余表空间只能使用字典管理表空间
包括回滚段
selectsegment_name,tablespace_namefromdba_rollback_segs;
SEGMENT_NAMETABLESPACE_NAME
------------------------------------------------------------
SYSTEMSYSTEM
_SYSSMU1$UNDOTBS1
_SYSSMU2$UNDOTBS1
_SYSSMU3$UNDOTBS1
_SYSSMU4$UNDOTBS1
_SYSSMU5$UNDOTBS1
_SYSSMU6$UNDOTBS1
_SYSSMU7$UNDOTBS1
_SYSSMU8$UNDOTBS1
_SYSSMU9$UNDOTBS1
_SYSSMU10$UNDOTBS1
_SYSSMU11$UUUUD
_SYSSMU12$UUUUD
_SYSSMU13$UUUUD
_SYSSMU14$UUUUD
_SYSSMU15$UUUUD
_SYSSMU16$UUUUD
_SYSSMU17$UUUUD
_SYSSMU18$UUUUD
_SYSSMU19$UUUUD
_SYSSMU20$UUUUD
UD1UUUUD
已选择22行。
默认创建system回滚段1个
非系统回滚段10个
每次创建一个回滚表空间,包含10个回滚段
单独增减了一个回滚段UD1
从9i以后,创建回滚段不再需要undo表空间了,本例使用的是system表空间
createrollbacksegment"
1ud"
storage(initial100knext100kminextents2maxextents
100optimal1100k);
UD1UUUUD
_SYSSMU22$UUUUUD
_SYSSMU23$UUUUUD
_SYSSMU24$UUUUUD
_SYSSMU25$UUUUUD
_SYSSMU26$UUUUUD
_SYSSMU27$UUUUUD
_SYSSMU28$UUUUUD
_SYSSMU29$UUUUUD
_SYSSMU30$UUUUUD
_SYSSMU31$UUUUUD
1udSYSTEM
已选择33行。
当回滚段创建后,回滚段是离线的,不能被数据库使用,为了使回滚段被事务利用,必须将回滚段在线。
可以用以下命令使回滚段在线:
selectsegment_name,tablespace_name,statusfromdba_rollback_segs;
SEGMENT_NAMETABLESPACE_NAMESTATUS
----------------------------------------------------------------------------
SYSTEMSYSTEMONLINE
_SYSSMU1$UNDOTBS1OFFLINE
_SYSSMU2$UNDOTBS1OFFLINE
_SYSSMU3$UNDOTBS1OFFLINE
_SYSSMU4$UNDOTBS1OFFLINE
_SYSSMU5$UNDOTBS1OFFLINE
_SYSSMU6$UNDOTBS1OFFLINE
_SYSSMU7$UNDOTBS1OFFLINE
_SYSSMU8$UNDOTBS1OFFLINE
_SYSSMU9$UNDOTBS1OFFLINE
_SYSSMU10$UNDOTBS1OFFLINE
_SYSSMU11$UUUUDOFFLINE
_SYSSMU12$UUUUDOFFLINE
_SYSSMU13$UUUUDOFFLINE
_SYSSMU14$UUUUDOFFLINE
_SYSSMU15$UUUUDOFFLINE
_SYSSMU16$UUUUDOFFLINE
_SYSSMU17$UUUUDOFFLINE
_SYSSMU18$UUUUDOFFLINE
_SYSSMU19$UUUUDOFFLINE
_SYSSMU20$UUUUDOFFLINE
UD1UUUUDOFFLINE
_SYSSMU22$UUUUUDOFFLINE
_SYSSMU23$UUUUUDOFFLINE
_SYSSMU24$UUUUUDOFFLINE
_SYSSMU25$UUUUUDOFFLINE
_SYSSMU26$UUUUUDOFFLINE
_SYSSMU27$UUUUUDOFFLINE
_SYSSMU28$UUUUUDOFFLINE
_SYSSMU29$UUUUUDOFFLINE
_SYSSMU30$UUUUUDOFFLINE
_SYSSMU31$UUUUUDOFFLINE
1udSYSTEMOFFLINE
ALTERROLLBACKSEGMENT"
online;
回退段已变更。
1udSYSTEMONLINE
切换UNDO表空间.
启动例程并打开数据库后,同一时刻特定例程只能使用一个UNDO表空间,切换UNDO表空间是指停止例程当前使用的UNDO表空间,并启动其他UNDO表空间,下面以启用undotbs2表空间为例,说明切换UNDO表空间的方法.
ALTERSYSTEMSETundo_tablespace=undotbs02;
可以使用ALTERROLLBACKSEGMENT命令修改回滚段的存储参数(包括OPTIMAL,MAXEXTENTS)。
语法:
ALTERROLLBACKSEGMENTrollback_segment
[STORAGE([NEXTinteger[K|M]]
[MINEXTENTSinteger]
[MAXEXTENTS{integer|UNLIMITED}]
[OPTIMAL{integer[K|M]|NULL}])]
例:
ALTERROLLBACKSEGMENTrbs01STORAGE(MAXEXTENTS1000);
回收回滚段的空间
如果指定了回滚段的OPTIMAL参数,ORACLE将自动回收回滚段到OPTIMAL指定的位置。
用户也可以手动回收回滚段的空间
shrink;
shrinkto1m;
如果不指明TOinteger的数值,ORACLE将试图回收到OPTIMAL的位置。
使回滚段离线
为了达到以下两个目的将要回滚段离线: