Oracle数据库回滚段专题.docx

上传人:b****4 文档编号:4212246 上传时间:2022-11-28 格式:DOCX 页数:16 大小:21.27KB
下载 相关 举报
Oracle数据库回滚段专题.docx_第1页
第1页 / 共16页
Oracle数据库回滚段专题.docx_第2页
第2页 / 共16页
Oracle数据库回滚段专题.docx_第3页
第3页 / 共16页
Oracle数据库回滚段专题.docx_第4页
第4页 / 共16页
Oracle数据库回滚段专题.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

Oracle数据库回滚段专题.docx

《Oracle数据库回滚段专题.docx》由会员分享,可在线阅读,更多相关《Oracle数据库回滚段专题.docx(16页珍藏版)》请在冰豆网上搜索。

Oracle数据库回滚段专题.docx

Oracle数据库回滚段专题

Oracle数据库回滚段专题

回滚段概述

  回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)。

回滚段的头部包含正在使用的该回滚段事务的信息。

一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息。

回滚段的作用

事务回滚:

当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。

事务恢复:

当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。

读一致性:

当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。

而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。

当ORACLE执行SELECT语句时,ORACLE依照当前的系统改变号(SYSTEMCHANGENUMBER-SCN)来保证任何前于当前SCN的未提交的改变不被该语句处理。

可以想象:

当一个长时间的查询正在执行时,若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。

事务级的读一致性

  ORACLE一般提供SQL语句级(SQLSTATEMENTLEVEL)的读一致性,可以用以下语句来实现事务级的读一致性。

SETTRANSACTIONREADONLY;

  或:

SETTANNSACTIONSERIALIZABLE;

  以上两个语句都将在事务开始后提供读一致性。

需要注意的是,使用第二个语句对数据库的并发性和性能将带来影响。

回滚段的种类

  系统回滚段:

当数据库创建后,将自动创建一个系统回滚段,该回滚段只用于存放系统表空间中对象的前影像,比如数据字典。

  非系统回滚段:

拥有多个表空间的数据库至少应该有一个非系统回滚段,用于存放非系统表空间中对象的数据前影像。

非系统回滚段又分为私有回滚段和公有回滚段,私有回滚段应在参数文件的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自动进行。

SQL>showparameterundo

NAMETYPEVALUE

-----------------------------------------------------------------------------

undo_managementstringAUTO

undo_retentioninteger900

undo_tablespacestringUNDOTBS1

想使用手动管理回滚段?

SQL>selectname,isses_modifiable,issys_modifiablefromv$parameterwherenamelike'%undo

%';

NAME

--------------------------------------------------------------------------------

ISSESISSYS_MOD

--------------

undo_management

FALSEFALSE

undo_tablespace

FALSEIMMEDIATE

undo_retention

FALSEIMMEDIATE

不支持直接修改回滚段参数

SQL>altersystemsetundo_management=manualscope=spfile;

系统已更改。

SQL>startupforce

ORACLE例程已经启动。

SQL>showparameterundo

NAMETYPEVALUE

-----------------------------------------------------------------------------

undo_managementstringMANUAL

undo_retentioninteger900

undo_tablespacestringUNDOTBS1

现在回滚段属于手动管理状态

SQL>createrollbacksegmentun_do1tablespaceun_dostorage(initial100knext100kminex

tents10maxextents100optimal1000k);

createrollbacksegmentun_do1tablespaceun_dostorage(initial100knext100kminextents

10maxextents100optimal1000k)

*

第1行出现错误:

ORA-30574:

无法利用AUTO段空间管理在表空间中创建回退段

不能在使用自动段空间上使用建立回滚段

SQL>createtablespaceuuuddatafile'E:

\oracle\product\10.2.0\oradata\ORACLE\DATAFILE\uuu

d.dbf'size10mextentmanagementlocaluniformsegmentspacemanagementmanual;

表空间已创建。

建立手动段空间

SQL>createrollbacksegmentud1tablespaceuuudstorage(initial100knext100kminextents10maxextents100optimal1000k);

createrollbacksegmentud1tablespaceuuudstorage(initial100knext100kminextents10

maxextents100optimal1000k)

*

第1行出现错误:

ORA-01593:

回退段最佳大小(125blks)小于计算的初始大小(130blks)

初始区100k,最小10个区,而回滚段最佳大小事1000k,小于回滚段最小空间,所以报错

SQL>createrollbacksegmentud1tablespaceuuudstorage(initial100knext100kminextents10maxextents100optimal1100k);

createrollbacksegmentud1tablespaceuuudstorage(initial100knext100kminextents10

maxextents100optimal1100k)

*

第1行出现错误:

ORA-01552:

非系统表空间'UUUD'不能使用系统回退段

非系统永久表空间不能使用回滚段

SQL>createundotablespaceuuuuddatafile'E:

\oracle\product\10.2.0\oradata\ORACLE\DATAFILE\uuuud.dbf'size10mRETENTIONNOGUARANTEE;

表空间已创建。

SQL>createrollbacksegmentud1tablespaceuuuudstorage(initial100knext100kminexten

ts10maxextents100optimal1100k);

回退段已创建。

如果系统表空间使用本地管理表空间,其余表空间只能使用本地管理表空间

如果系统表空间使用字典管理表空间,其余表空间只能使用字典管理表空间

包括回滚段

SQL>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

SEGMENT_NAMETABLESPACE_NAME

------------------------------------------------------------

_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表空间

SQL>createrollbacksegment"1ud"storage(initial100knext100kminextents2maxextents

100optimal1100k);

回退段已创建。

SQL>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

SEGMENT_NAMETABLESPACE_NAME

------------------------------------------------------------

_SYSSMU11$UUUUD

_SYSSMU12$UUUUD

_SYSSMU13$UUUUD

_SYSSMU14$UUUUD

_SYSSMU15$UUUUD

_SYSSMU16$UUUUD

_SYSSMU17$UUUUD

_SYSSMU18$UUUUD

_SYSSMU19$UUUUD

_SYSSMU20$UUUUD

UD1UUUUD

SEGMENT_NAMETABLESPACE_NAME

------------------------------------------------------------

_SYSSMU22$UUUUUD

_SYSSMU23$UUUUUD

_SYSSMU24$UUUUUD

_SYSSMU25$UUUUUD

_SYSSMU26$UUUUUD

_SYSSMU27$UUUUUD

_SYSSMU28$UUUUUD

_SYSSMU29$UUUUUD

_SYSSMU30$UUUUUD

_SYSSMU31$UUUUUD

1udSYSTEM

已选择33行。

当回滚段创建后,回滚段是离线的,不能被数据库使用,为了使回滚段被事务利用,必须将回滚段在线。

可以用以下命令使回滚段在线:

SQL>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

SEGMENT_NAMETABLESPACE_NAMESTATUS

----------------------------------------------------------------------------

_SYSSMU11$UUUUDOFFLINE

_SYSSMU12$UUUUDOFFLINE

_SYSSMU13$UUUUDOFFLINE

_SYSSMU14$UUUUDOFFLINE

_SYSSMU15$UUUUDOFFLINE

_SYSSMU16$UUUUDOFFLINE

_SYSSMU17$UUUUDOFFLINE

_SYSSMU18$UUUUDOFFLINE

_SYSSMU19$UUUUDOFFLINE

_SYSSMU20$UUUUDOFFLINE

UD1UUUUDOFFLINE

SEGMENT_NAMETABLESPACE_NAMESTATUS

----------------------------------------------------------------------------

_SYSSMU22$UUUUUDOFFLINE

_SYSSMU23$UUUUUDOFFLINE

_SYSSMU24$UUUUUDOFFLINE

_SYSSMU25$UUUUUDOFFLINE

_SYSSMU26$UUUUUDOFFLINE

_SYSSMU27$UUUUUDOFFLINE

_SYSSMU28$UUUUUDOFFLINE

_SYSSMU29$UUUUUDOFFLINE

_SYSSMU30$UUUUUDOFFLINE

_SYSSMU31$UUUUUDOFFLINE

1udSYSTEMOFFLINE

已选择33行。

SQL>ALTERROLLBACKSEGMENT"1ud"online;

回退段已变更。

SQL>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

SEGMENT_NAMETABLESPACE_NAMESTATUS

----------------------------------------------------------------------------

_SYSSMU11$UUUUDOFFLINE

_SYSSMU12$UUUUDOFFLINE

_SYSSMU13$UUUUDOFFLINE

_SYSSMU14$UUUUDOFFLINE

_SYSSMU15$UUUUDOFFLINE

_SYSSMU16$UUUUDOFFLINE

_SYSSMU17$UUUUDOFFLINE

_SYSSMU18$UUUUDOFFLINE

_SYSSMU19$UUUUDOFFLINE

_SYSSMU20$UUUUDOFFLINE

UD1UUUUDOFFLINE

SEGMENT_NAMETABLESPACE_NAMESTATUS

----------------------------------------------------------------------------

_SYSSMU22$UUUUUDOFFLINE

_SYSSMU23$UUUUUDOFFLINE

_SYSSMU24$UUUUUDOFFLINE

_SYSSMU25$UUUUUDOFFLINE

_SYSSMU26$UUUUUDOFFLINE

_SYSSMU27$UUUUUDOFFLINE

_SYSSMU28$UUUUUDOFFLINE

_SYSSMU29$UUUUUDOFFLINE

_SYSSMU30$UUUUUDOFFLINE

_SYSSMU31$UUUUUDOFFLINE

1udSYSTEMONLINE

已选择33行。

切换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指定的位置。

用户也可以手动回收回滚段的空间

SQL>ALTERROLLBACKSEGMENT"1ud"shrink;

回退段已变更。

SQL>ALTERROLLBACKSEGMENT"1ud"shrinkto1m;

回退段已变更。

如果不指明TOinteger的数值,ORACLE将试图回收到OPTIMAL的位置。

使回滚段离线

  为了达到以下两个目的将要回滚段离线:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1