文档库 最新最全的文档下载
当前位置:文档库 › Managing Rollback Segments

Managing Rollback Segments

Managing Rollback Segments
Managing Rollback Segments

Managing Rollback Segments

Posted by admin on Saturday, January 2nd, 2010

1、创建rollback segments

CREATE [PUBLIC] ROLLBACK SEGMENT rollback_segment

[TABLESPACE tablespace]

[STORAGE ( [INITIAL integer[K|M]]

[NEXT integer[K|M]]

[MINEXTENTS integer]

[MAXEXTENTS {integer | UNLIMITED}]

[OPTIMAL {integer[K|M] | NULL}]

)]

1)rollback segment在创建时被指定为public或是private(默认情况),此后就不能再修改了。

2)对于一个rollback segment,MINEXTENTS必须至少为2

3)不能为其指定PCTINCREASE,该值被设定为0

4)OPTIMAL,如果被设置,必须至少等于initial size,被用于MINEXTENTS定义的extents数量。

5)部分方针:

* 一般设置INITIAL = NEXT,从而确保rollback segments中的所有extents 大小一致

* 设置OPTIMAL值,从而最小化rollback segment extents的分配和收回 * 避免将MAXEXTENTS设置为UNLIMITED。这将可能会使rollback segments 不断增大,data files不断增大,从而可能会造成program error。

* 将rollback segments放在独立的tablespace中,最小化冲突和磁盘碎片。

2、transaction和rollback segments

1)当transaction开始时,rollback segment需要被分配给transaction。可以使用下面的语句:

SET TRANSACTION USE ROLLBACK SEGMENT rollback_segment;

如果没有明确的执行此句申请,则Oracle server会选择当前transaction最少的segment分配给此transaction。

2)transactions使用rollback segment中的extents,是以连续循环的方式进行的。一个transaction写一个rollback entry到当前的rollback segment

位置,并根据写入的size,移动当前的指针。注意:多个transactions可以写入rollback segment的同一个extent,但是,每个rollback segment block 只能保存一个transaction的相关信息。

3)rollback segments的增长

当当前extent中所有的blocks被占用,同时有transaction再次申请rollback segment block时,其指针将移动到下一个extent。当最后一个extent也慢了的时候,pointer将移动到第一个extent——但是必须有一个前提,就是该extent没有active transaction。pointer是不能跳过某个extent的。所以如果所有的extents都被active transaction占用时,将会申请新的extent。直到其达到Maximum extents数。

4)rollback segments的shrinkage

在create rollback segments时,optimal指明的参数以byte为单位指定了rollback segment的shrink到的size——如果可以shrink时。指明optimal 参数可以最小化对rollback segments的浪费,可以在引起rollback segment 增长的transactions完成后释放空间。但空间的释放不是transactions结束后马上进行,回收extents的进程只有在head从一个extent移动到下一个extent 时才会执行。只有当下面的条件都满足,extents才会被收回:

* 当前的rollback segment的size大于optimal参数的值

* 将被收回的extents是连续的inactive。

3、当rollback segment被创建后,还处于offline状态,还不能被使用。必须将其设置为online。

ALTER ROLLBACK SEGMENT rollback_segment ONLINE;

Oracle Instance的MAX_ROLLBACK_SEGMENTS参数设定而已为online状态的rollback segments的数量。

设置后rollback segments会一直online,直到Instance被shutdown。为了rollback segment总是online。需要在参数文件中设置参数如下:ROLLBACK_SEGMENTS=(rbs01_name, rbs02_name)

4、其他常用操作

1)修改rollback segments

ALTER ROLLBACK SEGMENT rollback_segment

[STORAGE ( [NEXT integer[K|M]] [MINEXTENTS integer]

[MAXEXTENTS {integer | UNLIMITED}]

[OPTIMAL {integer[K|M] | NULL}]

)]

2)手工收回rollback segments

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

如果integer被省略,则会尽量shrink到optimal参数指定的大小。

3)将rollback segments转换为offline

ALTER ROLLBACK SEGMENT rbs_name OFFLINE;

如果当前该rollback segment正在被transaction使用,则其会被暂时变为PENDING OFFLINE。这可以从V$ROLLSTAT视图中看到。当transaction结束后,会立即设置为offline。

当希望不会有新的transaction使用该rollback segment,或是想删除该rollback segment时,需要将其设置为offline。

4)删除rollback segments(此时其必须为offline的)

DROP ROLLBACK SEGMENT rbs_name;

如果当前rollback segments不需要被使用了,或是想要修改rollback segment 的INITIAL、NEXT或是MINEXTENTS参数时,需要drop rollback segment。

5、rollback segments的安排

1)rollback segments的数量:在rollback segment的header block中,存放了一个transaction 表,描述了每个使用该segment的状态。所以每个使用该segments的transaction都会频繁的修改此transaction table。这可能造成header的争用。所以对于OLTP环境中建议使用多个size不大的rollback segments,推荐使用4个transaction每个rollback segments。而对于批量处理环境,需要较大的rollback segment,所以可以使用少量大rollback segments,允许其自动增长。

2)rollback segment的size:这主要是看具体application中的执行的操作比率和操作的实际data。一般,insert操作产生的rollback data最少,只记录ROWID;而delete需要记录实际删除的row的data;update产生的rollback data 最多。

3)extents的数量:推荐将MINEXTENTS设置为20,从而降低rollback segments 的动态扩展。

4)为了避免出现read-consistency errors,可以设置更大的MINEXTENTS参数,增大extent的size,提高optimal参数的值。

5)如果存在某个transaction,只进行了少量数据的改变,但随后一直处于idle 状态,并不commit或是rollback。这会引起不断的extended,并且造成空闲extents的浪费。这种情况需要DBA的介入。解决方法如下:

查看视图V$ROLLSTAT, V$SESSION, V$TRANSACTION,必要时kill掉阻塞的transaction

SELECT s.sid, s.serial#, t.start_time, t.xidusn, https://www.wendangku.net/doc/3b4859802.html,ername

FROM v$session s, v$transaction t, v$rollstat r

WHERE s.saddr = t.ses_addr

AND t.xidusn = https://www.wendangku.net/doc/3b4859802.html,n

AND ((r.curext= t.start_uext-1) OR

((r.curext=r.extents-1) AND t.start_uext=0));

6)

Posted in: Oracle9i DBA Fundamentals I Volume 2 ? Student Guide.

相关文档