Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2885593
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2010-01-09 23:52:00

 

                                                                                      回滚段概述

    回滚段收集开始事务处理之前存在的数据的“前”映像。其他用户可以查询数据变化之前的情况。无论数据库的其他部分工作如何出色,回滚段都需要一些特殊关注。由于回滚段控制着数据库处理事务的能力,所以直接决定着数据库的成功与否。

   SQL的ROLLBACK命令使用户能撤消对数据库所做 的事务。这种功能对任何UPDATE、 INSERT或者DELETE事务都有效;但对数据库对象的变动则无能为力(如alter table命令)。当选择其他用户正在改变的数据时,ORACLE使用回滚段来展示变动前的数据。

 

一、数据库对回滚段的使用

 

    回滚段包含数据库中发生的每一次事务处理,使数据库在多次变动中仍能保持读取的一致性。可用回滚段的数量和大小由DBA在数据库创建时设定。由于回滚段在数据库中创建,所以也必须在一个表空间中创建它们。第一个回滚段被称为SYSTEM,它存储在SYSTEM表空间中。接下来的回滚段通常也在另外至少一个表空间中创建。由于回滚段在表空间中创建,所以它们的最大尺寸也就要受数据文件空间容量的限制。因此,恰当地设置回滚段的大小是一项非常重要的工作。图7 - 1描述回滚段在表空间中的存储情况。

               

    回滚段条目(rollback segment entry)是“前”映像数据块的集合,含有被一个事务修改的
数据行。每个回滚段条目必须完整地包含在回滚段内。一个回滚段可以支持多个回滚段条目。这就使得可用回滚段的数目直接关系到数据库的性能。图7 - 2说明了回滚段与回滚段条目之间的关系。
    数据库以循环方式将事务分配给回滚段。这种分配方式使得每一个回滚段中被分配的事务数目比较平均。尽管可以给一个事务指定回滚段,但大多数事务使用缺省方式。因为使用循环分配方法,所以拥有不同大小的回滚段没有任何益处。
   可以创建指定为私有(private)或公用(public)的回滚段。这些指定表示该回滚段是对一个实例可用还是对访问那个数据库的多个实例可用。当一个实例打开一个数据库时,就显式获得私有回滚段.如果另一个实例访问同一数据库,这个实例就不能使用已由第一个实例获得的同一个私有回滚段,而只能使用它自己的私有回滚段或是从公用回滚段的共享池中获得。

 

 

 

 

 

    

 

1. SYSTEM回滚段
    SYSTEM回滚段在数据库创建时自动创建。在create database命令中,没有指定SYSTEM回滚段的名称及存储参数,它将自动在SYSTEM表空间中创建。SYSTEM回滚段的用途因配置不同而不同,若数据库有多个表空间(几乎所有数据库都是这样),就需要自己创建第二回滚段来支持多个表空间。如果有其他回滚段, SYSTEM回滚段就只用于管理数据库级的事务(如修改记录用户权限的数据字典表)。
2. 第二回滚段
    如果数据库中有多个表空间,就需要创建第二回滚段。除非至少有两个可用的回滚段,否则就不能将任何对象写入非SYSTEM表空间中。数据库创建时必须在SYSTEM表空间中创建第二回滚段。不过,不应使第二回滚段对成品事务有效,否则进行大型事务处理时,将会直接威胁到SYSTEM表空间的自由空间。因此,第二回滚段只应在数据库创建时被使用。只要回滚段的表空间已经创建,就需要在该表空间中创建回滚段,或者撤消SYSTEM表空间中的第二回滚段。
在考虑回滚段的情况下,数据库的创建过程应如下进行:
1) 创建一个数据库时,会自动在SYSTEM表空间中创建SYSTEM回滚段。
2) 在SYSTEM表空间中,创建名为r0的第二回滚段。
3) 使新的回滚段有效。然后可创建其他表空间

4) 创建R B S表空间,为以后的回滚段做准备。
5) 在R B S表空间中,创建另一个回滚段。
6) 停用SYSTEM表空间中的第二回滚段,并激活RBS中的新回滚段。
    尽管在数据库创建后就不再需要第二回滚段,但依然可以使其存在(但处于非激活状态)。为此,停用该回滚段,但不要撤消它。这样,在出现影响R B S表空间的紧急情况下,就可以迅速激活这个回滚段。
3. 产品回滚段
    非产品回滚段(Non-SYSTEM production rollback segment),支持使用数据库创建的回滚段条目。它们支持用r o l l b a c k命令来恢复修改前的数据映像。当回滚段出现问题或用户取消事务时,它们回滚事务。查询时,回滚段在执行查询前为那些被修改—但没有提交—的数据构造数据映。
    数据库按照循环(round-robin)方式,向产品回滚段分配回滚段条目。这种方法用于给回滚段分配事务(如图7 - 2所示)。由于一个回滚段可以支持多个事务,所以能创建一个大型回滚段来处理数据库中的所有事务。然而,这样的设计会因为回滚段的冲突而引起性能问题。因此,可能要创建许多小型回滚段,以便保证每个事务拥有自己的回滚段。但是如果创建的回滚段太小,就必须对回滚段进行动态扩展以适应它们的事务处理,从而使运行发生困难。所以,数据库回滚段的设计涉及如何恰当折衷回滚段大小和数量这两个问题.

 

二、激活回滚段

    激活回滚段就是使它对数据库用户可用。一个回滚段可以在不关闭的情况下,将其设置为非激活状态。这样既可以保留已分配给它的空间,也可以在将来需要时重新激活它,下面的例子提供了控制回滚段可用性的全部命令:

    通过alter rollback segment命令使一个回滚段从激活状态转变为非激活状态。

    alter rollback segment segment_name offline;

 

    若要撤消回滚段,请使用drop rollback segment命令。

    drop rollback segment segment_name;

 

    若要创建回滚段,请使用如下所示的create rollback segment命令:

    create rollback segment segment_name tablespace rbs;

 

    要注意的是,这个create rollback segment命令创建一个私有回滚段(因为没有使用public关
键字),并将它创建在称作RBS的非SYSTEM表空间中。由于未指定存储参数,回滚段将使用这个表空间的缺省存储参数。
    尽管回滚段已经创建,但还没有被数据库使用。若要激活新建的回滚段,请使用下面的
命令使它联机:

    alter rollback segment segment_name online;

    一旦回滚段被创建,就应当将其列入数据库的init.ora文件中。这个文件在数据库运行期间为只读文件。下面示出了回滚段的init.ora条目样例:

    rollback_segments=(r0,r1,r2)

 

注意:SYSTEM回滚段不会在init.ora文件中列出,并且SYSTEM 回滚段不能被撤消;它总是同实例能获得的其他回滚段一起被获取。

 

对于这个数据库,r0、r1和r2这三个回滚段为联机状态。若要取消其中一个,只需从init.ora文件中移去其条目。当使一个回滚段为联机状态时,在其当前有效事务完成之前它将一直保持联机状态。

 

三、为事务处理指定回滚段

 

    可以用set transaction命令指定一个事务处理应使用的回滚段。但应在实施大的事务处理
前使用这个命令,以确保这个事务处理使用为它们特别创建的回滚段。
    通过set transaction命令指定的这种设置只适用于当前事务。下面的例子示出一系列的事
务。第一个事务被指定使用ROLL_BATCH回滚段,第二个事务(在第二个commit之后)将被随
机地分配给一个产品回滚段。

 

commit;
set transaction user rollback segment roll_batch;
insert into TABLE_NAME  select * from DATA_LOAD_TABLE;


COMMIT;

REM* The commit command clears the rollback segment assignment.
REM* Implicit commits,like those caused by DDL commands,will also clear the rollback segment designation.


insert into TABLE_NAME select * from SOME_OTHER_TABLE;

阅读(2644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~