登录 |  注册
首页 >  数据库 >  Oracle入门学习教程笔记 >  Oracle回滚段的创建及其操作

Oracle回滚段的创建及其操作

创建回滚段语法

CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment
     [TABLESPACE tablespace]
     [STORAGE ([INITIAL integer[K|M]] [NEXT integer[K|M]]
           [MINEXTENTS integer]
           [MAXTENTS {integer|UNLIMITED}]
           [OPTIMAL {integer[K|M]|NULL}]) ]

注:

  • 回滚段可以在创建时指明 PRIVATE 或 PUBLIC ,一旦创建将不能修改。

  • MINEXTENTS 必须大于等于 2

  • PCTINCREASE 必须是 0

  • OPTIMAL 如果要指定,必须大于等于回滚段的初始大小(由 MINEXTENTS 指定)

建议:

  • 一般情况下, INITIAL=NEXT

  • 设置 OPTIMAL 参数来节约空间的使用

  • 不要设置 MAXEXTENTS 为 UNLIMITED

  • 回滚段应创建在一个特定的回滚段表空间内

参数的意义同建表上样,但这里不允许使用 pctincrease 参数,因此其增涨百分比总是零。这里的参数的使用(执行效果)与表的参数有很大的不同。一表中的数据在关机后仍放于该表空间所对应的数据文件中,而回滚段只在系统运行且在 insert , update , delete 时用,后即可释放(让别的 transaction 用),且在关机后所记录的所有回滚信息均被释放,因而就有扩展后的空间如何释放的问题,即保持多少空间为最佳的问题(由 OPTIMAL )设定。 Optimal 可以避免“ snapshot too old ”错误的发生,为每个 rollback segmal 指定一个 optimal 以便在内存中保持一个较少的 cache 值,从而提高性能。

例:

create tablespace rbs datafile '/data/oradata/cts/rbs01.dbf' size 100M autoextend on next 10M maxsize 150M;
create public rollback segment rbs01 tablespace rbs storage(initial 100K next 100K minextents 10 maxextents 100 optimal 1000K);
select segment_name,tablespace_name,status from  dba_rollback_segs ;

但是:创建成功后也查询不到,因为从 9i 开始,回滚段开始自动管理,不需要手动创建

SQL> show parameter undo
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1

如果想改回手动管理需要执行一下操作:

ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL  SCOPE=SPFILE
Alter system set undo_management=MANUAL scope=spfile;
shutdown immediate                            
startup                                       
select segment_name,owner,status from dba_rollback_segs;

改变回滚段

当回滚段建立好了之后,有时需要对它们进行修改。可以对回滚段进行存储参数的修改,可以对某个脱机( OFFLINE )回滚段修改为联机( ONLINE )。也可能对已经处于联机的回滚段设置为脱机,比如当我们进行 IMP 或大量修改数据时, ORACLE 总是需要大的回滚段。但由于分配回滚段是 ORACLE 系统包办。为了在事务处理中得到大的回滚段,我们只能 将较小的回滚段设置为脱机的状态 ,等到我们所处理的事务完成后在将它们设置为联机等。

设置实例重启动后回滚段联机

除了上面使用 CREATE ROLLBACK SEGMENT 命令完成回滚段的创建外,要使 ORACLE 系统关闭重新启动后仍然处于联机,还要在 initsid.ora 参数文件中 rollback_segments 参数加上回滚段的名字,如:

  rollback_segments= (r0 , r1 , r2 )

使回滚段在线

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

ALTER ROLLBACK SEGMENT rollback_segment ONLINE;

例:

ALTER ROLLBACK SEGMENT rbs01 ONLINE;

为了使回滚段在数据库启动时自动在线,可以在数据库的参数文件中列出回滚段的名字。例如在参数文件中加入以下一行:

ROLLBACK_SEGMENT=(rbs01,rbs02)
select name,status,gets,waits from v$rollname,v$rollstat where v$rollstat.usn=v$rollname.usn;

回滚段的扩张( EXTEND )

当当前回滚段区的所有块用完而事务还需要更多的回滚空间时,回滚段的指针将移到下一个区。当最后一个区用完,指针将移到第一个区的前面。回滚段指针移到下一个区的前提是下一个区没有活动的事务,同时指针不能跨区。当下一个区正在使用时,事务将为回滚段分配一个新的区,这种分配称为回滚段的扩展。回滚段将一直扩展到该回滚段区的个数到达回滚段的参数 MAXEXTENTS 的值时为止。

回滚段扩展次数的限制

在比较旧的 ORACLE 版本里,回滚段的扩展次数受到一些限制,它与实例的块大小有关。比如:

当 ORACLE 块= 2k 时, maxextents     121

当 ORACLE 块= 4k 时, maxextents     249

当 ORACLE 块= 8k 时, maxextents     505

当 ORACLE 块= 16k 时, maxextents   1017

当 ORACLE 块= 32k 时, maxextents   2041

注:在 ORACLE V7.3 以后, Maxextents 的扩展次数已被取消,你可以设得足够大。甚至可以设为 UNLIMITED ( =249 000 000 ) 。

回滚段的回收和 OPTIMAL 参数

OPTIMAL 参数指明回滚段空闲时收缩到的位置,指明回滚段的 OPTIMAL 参数可以减少回滚段空间的浪费。

设置 OPTIMAL 参数

由于回滚段是一个动态的对象,它在使用中根据增删改的数据量而增加(扩展),但在用完后就被释放,然后另外的事务可以用。为了避免某个回滚段在扩展后总占用量的空间,不利于另外的回滚段的扩展, ORACLE 提供了 optimal 参对回滚段进行控制,该参数的意义是回滚段在扩展过程中,当事务完成后(发 commit , rollback 后),将回滚段的大小按照 optimal 值进性收缩。

需要注意的是, optimal 参数的设置不能比已经分配的空间还小。也就是说, optimal 的设置要比初始的扩展的还大才正确。比如:

一般 optimal = minextents *  initial +

( minextents + n ) * next

其中,要求 minextents>=1 ; n>= 1

例如:

CREATE ROLLBACK SEGMENT rbs21 tablespace rbs
STORAGE( initial 10m next 2m minextents 2 optimal 16M );

这里 optimal 只能填 14m 或 16m 或 18m 等,不能填 12m, 因为最小扩展为 2 次,即 rbs21 回滚段的开始分配已经是 10m + 2m = 12m ,根据 optimal 要大于初始值的原则,所以 optimal 至少从 14m 开始。

例子:

systen 回滚段的初始分配 initial = 409600 ;

下一次分配 next = 57344 ;

最佳扩展值 optimal= null ;

根据这样的情况,我们可以修改下一次分配的值为 1MB(=1024000 字节 ) ;修改最佳扩展值为: optimal = initial + 2 * next = 409600 + 2* 1024000 = 2457600  。所以修改 SYSTEM 回滚的命令为:

SQL> alter rollback segment  system  storage(next 1m optimal 2457600);

注: optimal 表示在事务处理当中,该回滚段由于增、删、改的数据量的需要而不断对回滚段进行扩展,以满足事务的要求,但是在事务处理完成后可以让回滚段缩小到一个最佳的范围内。这就是由回滚段的 OPTIMAL 参数来控制。一般 optimal = initial + n* next , 且   n >1 。

修改回滚段的存储参数

可以使用 ALTER ROLLBACK SEGMENT 命令修改回滚段的存储参数(包括 OPTIMAL , MAXEXTENTS )。

语法:

  ALTER ROLLBACK SEGMENT rollback_segment
   [STORAGE ([NEXT integer[K|M]]
       [MINEXTENTS integer]
       [MAXEXTENTS {integer|UNLIMITED}]
       [OPTIMAL {integer[K|M]|NULL}]) ]

例:

 ALTER ROLLBACK SEGMENT rbs01 STORAGE (MAXEXTENTS 1000);

回收回滚段的空间

如果指定了回滚段的 OPTIMAL 参数, ORACLE 将自动回收回滚段到 OPTIMAL 指定的位置。用户也可以手动回收回滚段的空间。

语法:

   ALTER ROLLBACK SEGMENT rollback_segment SHRINK [TO integer [K|M]];

说明:

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

例:

ALTER ROLLBACK SEGMENT rbs01 SHRINK TO 2M;

使回滚段离线

select name,status,gets,waits from v$rollname,v$rollstat where v$rollstat.usn=v$rollname.usn;

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

  1. 阻止新的事务使用该回滚段;

  2. 该回滚段必须删除。

语法:

ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;

例:

 ALTER ROLLBACK SEGMENT rbs01 OFFLINE;

说明:

如果有事务正在使用该回滚段,运行该命令后,回滚段的状态将是 PENDING OFFLINE 。事务结束后,状态将改为 OFFLINE ,可以通过 V$ROLLSTAT 查询回滚段的状态。

观察回滚段的增长

虽然回滚段在使用过程中作过扩展而在用完后又自动按照 OPTIMAL 要求大小缩小,但在动态字典 V$ROLLSTAT 中会记录曾经扩展的情况。命令如下:

select   n.name, optsize, hwmsize from v$ROLLNAME n , V$ROLLSTAT s where n.usn=s.usn ;

optsize  是 最优大小值, hwmsize =Hight water mark of rollback segment  size 回滚段扩展中最高值(水位)。如果 optsize 为空,则 hwmsize 就是当前最高值。

增加 ORACLE 系统 rbs 表空间数据文件

alter tablespace rbs add datafile '/disk1/ORACLE/oradata/ora8/rbs02.dbf' size 120m ;

在事务中指定使用回滚段

由于回滚段建立好了后,在处理中回滚段的使用是由系统安排的,这样就有可能在处理中 实际需要较大的回滚段而系统总是分配较小的回滚而导致处理失败 。为避免这样的失败出现。就要在命令中或程序中用 SET TRANSACTION USE ROLLBACK SEGMENT 命令来实现。

需要注意的是,在程序中使用设置命令时,要在程序的开始来使用 SET TRANSACTION 语句,而且在每次的 COMMIT 或 ROLLBACK 语句后都要重新使用 SET TRANSACTION 语句,如果在 COMMIT 或 ROLLBACK 语句后不再使用 SET TRANSACTION 语句,系统会释放原来被分配的回滚 段而随机分配新的回滚段。下面给出在 SQL 下和在 PL/SQL 下使用回滚段的例子.

在执行大事务时 , 有时 oracle 会报出如下的错误 :

ORA-01555 :snapshot too old (rollback segment too small)

这说明 oracle 给此事务随机分配的回滚段太小了 , 这时可以为它指定一个足够大的回滚段 , 以确保这个事务的成功执行。

set transaction use rollback segment roll_abc;    
delete from table_name where ...    
commit;

回滚段 roll_abc 被指定给这个 delete 事务 ,commit 命令则在事务结束之后取消了回滚段的指定 .

1. 在 SQL> 下使用回滚段:

在 SQLPLUS 下进行任何大量的 INSERT 、 UPDATE 和 DELETE 都要用到回滚段,如何你希望操作能成功的话,你应该在操作前指定要用大的回滚段。如:

Commit;
Set  transaction  use   rollback  segment    r1;
Delete from ...
Commit;
Set  transaction use rollback segment   r1;

例子:为大事务建立大的回滚段:

create rollback segment  interest   tablespace  interest_tabspace
storage( initial  50m  next 10m  optimal  80m  pct_increase 0 );

确定回滚段的数目

回滚段的数量直接影响到系统的性能,如果回滚段的个数不够多,则在多个用户同时进行增、删、该时就存在等待现象。

要确定是否增加回滚段的数量,先要查询两个动态视图,即 V$ROLLSTAT , V$WAITSTAT 。如:

SQL> select * from v$waitstat where class='undo header';
CLASS                   COUNT       TIME
------------------ ---------- ----------
undo header                 0          0
 
SQL> select usn,extents,waits from v$rollstat;
 
       USN    EXTENTS      WAITS
---------- ---------- ----------
         0          5          0
         1          8          0
         2          8          0
         3          8          0
         4          8          0
         5          8          0
         6          8          0
         7          8          0

如果 waits 存在大于 0 的数 ,则需要 增加 回滚段的数量。一般回滚段的数量主要根据应用系统的类型来决定。比如一般的历史档案系统,由于其主要处理是查询。这类增、删、改相对较少的应用,可以建立较少的回滚段。而想银行、证券等应用。就需要很多的回滚段。那么到底要多少才相对就够了呢? 下面的回答具有一般性:

在并发程度要求高的应用系统,同一时间内有多个 transaction 在竞争竟争回退段。假如 transaction 为事务的个数;则有:

n= transaction/transactions_per_rollback_segment

其中:

n= 回退段数量

transaction 为 ORACLE 系统参数,系统中允许并发处理的最大 transaction 数。

transactions_per_rollback_segment 为 ORACLE 参数,每个回退段允许同时写入的最大 transaction 数。

另外,如果从 v$waitstat 动态视图中查出自数据库启动后回退头的等待次数较高,则应该多建立回滚段。

创建通用回滚段

无论是任何类型的应用,建议重新建立新的回滚段。除了上面介绍的建立专门的回滚段以外,需要建立初始值,下次增加及最佳值合适的值。一般建议是 初始值 最好是 5MB 以上,下次增长为 2MB 至 5MB 之间,最佳值在 20M 至 30MB 之间。

删除已存在的回滚段 r01

当回滚段不再需要或要重建以改变 INITIAL , NEXT 或 MINEXTENTS 参数时,可以将其删除。要删除回滚段,不许使该回滚段离线。

语法:

DROP ROLLBACK SEGMENT rollback_segment;

例:

DROP ROLLBACK SEGMENT rbs01;

查询回滚段的信息

所用数据字典: DBA_ROLLBACK_SEGS

alter rollback segment r01 offline;
drop rollback segment r01;

回滚段使用量的估算

如何保证有足够的回滚段,满足多个并发的 transaction 同时使用,又要考虑应有足够大的回滚段来满足特殊的 transaction( 如 long-runing transaction) 的需要。这就是如何考虑回滚段的数量和大小的问题。除了 system 回滚段外,通常还要创建多个回滚段,通常较短的 transaction 适于使用较小的回滚段,这将使系统将使系统有较好性能(因为大量的回滚信息可缓存于 sga 中。从而减少对硬盘的 I/O )。而大的 transaction 则需要使用较大的回滚段,因为大量的回滚信息可以存入事先分配的 extent 中避免了动态分配空间;同时也防止 transaction 运行期间,用尽回滚段的空间后,而导致数据库出现 ora-01562 错误。

1 、 回滚信息量

存储于回滚段中的回滚信息量取决于 transaction (insert , update , delete ) 类型和实际处理数据量,通常, insert 向表中插入一第记录 所产 生的回滚数据 小于 delele 从表中删除一条记录 。因为回滚 insert 所产生的记录只是需删除它,而回滚一条删除记录需要重新插入该记录,前者在回滚段中只存储 rowid ,后者则存储了重新这条记录的所有信息。

2 .回滚数据量的估计

到目前为止, ORACLE 不能提供一个很好的回滚段数据量的计算,作为 dba 可以 用下面方法进行估算:

1) 建立一个较小的测试表(数据来自实际表 EMP );

create table emp1  as select  *  from  emp where  deptno <=10;

2) 模仿(实际 updeste 语句) transaction 作如下测试:

update emp1  set  deptno=1050  where  deptno<=100;

3) 利用 v$rollstat

依据以上三步可以在 SQL> 下进行如下操作,从而得出基本回滚信息量:

SQL>select sum(writes) "begin"  from sys.v$rollstat;
SQL>update emp1 set deptno=1000 where deptno <=100;
SQL>select sum(writes)"end" from sys.v$rollstat;

小表的信息量 = end - begin = test

实际 transaction 的回滚信息量 = test * (emp_row / emp1_row ) * 1.05

由于一个 事务 的全部回滚信息可以写入多个 extent 中, 但每个回滚段的 extent 数量受到限制。所以在设置 storage 的 initial , next 参数时要小心, 一般回滚段中的 extent 保持在 10  到   20 为理想。为了在 extent 后的空间部分被释放, 在 STORAGE  中提供 optimal 参数用以控制回滚段的大小。当回滚段需要分配更多的空间超过 optimal 值后, RDBMS 将检查回滚段的大小,一旦额外分配的 extent 中无工作的 事务 且回滚段头正在指向 extent 时,系统将释放这个 extent 回滚段的大小向回缩, 直至到 optimal 指定值。

上一篇: Oracle回滚段的作用及查询
推荐文章
  • mysql只支持一种join算法:Nested-LoopJoin(嵌套循环连接),但Nested-LoopJoin有三种变种:SimpleNested-LoopJoin,IndexNested-LoopJoin,BlockNested-LoopJoin(简单-索引-缓冲区)原理:1.SimpleNe
  • redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化 redis持久化就是把数据保存在磁盘上,利用永久性存储介质将数据保存,在特定的时间将保存的数据进行恢复的工作机制redis提供两种持久化机制RDB:存储数据结果,关注点在数据AOF:存储操作
  • 通过SQL的执行过程来介绍MySQL的基础结构.     首先有一个user_info表,表里有一个id字段,执行下面这条查询语句:Select * form user_info where i
  • 索引(Index)是帮助MySQL高效获取数据的数据结构,索引的目的在于提高查询效率,就像字典和书籍的目录一样,有了目录,可以帮助你快速查找你需要的内容。可以理解为一个排好序的快速查找数据结构。也就是
  • 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
  • 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句
学习大纲