6.5 UNDO表空间的管理

当用户在数据库中执行INSERT、DELETE、UPDATE等DML操作时,相关的命令集合组成一个事务。在事务提交之前,用户还有机会回滚事务。事务回滚之后对数据库所作的修改将被取消,就好像没有发生任何事情一样。

回滚事务的结果是将被修改的数据还原为原状,也就是将回滚数据重新写回原来的地方。回滚数据也称为UNDO数据,是事务执行以前的数据,这些数据被存储在回滚段中。当用户提交事务时,回滚数据就失去了存在的意义。而当用户回滚事务时,数据库服务器将回滚数据从回滚段重新写入数据段,于是数据被恢复为原状。

回滚数据对于维护数据的一致性有非常重要的意义。例如,某个用户要在两个银行账号之间转账,数据库先在第一个账户上减去转账的金额,然后在第二个账户上加上相同的金额。这两步操作就构成一个事务,作为一整体来执行。假设在第一步刚执行完时,系统突然断电,结果会怎样呢?两个账户上的金额就对不上了。Oracle能够很好地解决这个问题。当数据服务器重新启动时,这个未提交的事务将被回滚,数据库服务器将回滚数据写入原来的位置,于是这次转账以失败告终,这样就保证了两个银行账户之间不会出现收支不平衡的现象。

回滚数据被存储在数据库中一段特殊的存储区域中。在Oracle 11g中,有两种管理回滚数据的方法,一种是自动方式,这种方式利用专门的UNDO表空间管理UNDO数据。第二种方法利用回滚段管理UNDO数据,这种方式称为手工方式。在一个数据库中我们只能选择使用其中一种方式。

手工方式即回滚段方式,是以前的Oracle版本使用的传统方式,这种方式的管理相当复杂,需要数据管理员做大量的工作,如确定回滚段的数量和大小,指定可用的回滚段等。如果回滚段的数量太少,或者空间太小,用户的事务可能被延缓执行,这时管理员需要回滚段进行手工扩展。

自动方式利用专门的UNDO表空间来管理回滚数据。如果创建了UNDO表空间,数据库服务器将自动使用UNDO表空间来管理回滚数据,整个过程不需要人工干预,从而大大减轻了管理员的负担。如果将UNDO表空间设置为可自动扩展,那么当用户的事务太多时,数据库服务器可以根据需要对UNDO表空间进行扩展。Oracle建议采用自动管理方式。

实际上自动方式也是利用回滚段来管理会滚数据的,回滚段包含在专门的UNDO表空间中,只不过回滚段不需要数据库管理员管理,而是由数据库服务器根据需要自动建立和删除的。

在创建数据库时,将自动创建一个UNDO表空间,表空间的名称为UNDOTBS1。在自动管理方式下,如果没有建立UNDO表空间,数据库服务器将利用SYSTEM表空间中的回滚段管理回滚数据。虽然数据库服务器也能运行,但这属于一种异常情况,将产生一条警告信息,而且这种情况将导致在SYSTEM表空间中产生大量存储碎片。因此,Oracle强烈建议创建一个UNDO表空间。

6.5.1 UNDO表空间的创建

有两种创建UNDO表空间的方式,一种是在创建数据库的同时创建UNDO表空间,另一种方式是在数据库运行过程中,通过CREATE UNDO TABLESPACE命令来创建。

创建数据库时,在默认情况下,将自动创建UNDO表空间UNDOTBS1。通过CREATE命令创建UNDO表空间的命令语法与普通表空间类似,主要的区别在于使用了“UNDO TABLESPACE”子句。

例如,以下语句用来创建大文件UNDO表空间UNDOTBS2:


SQL>CREATE BIGFILE UNDO TABLESPACE UNDOTBS2

DATAFILE'/home/oracle/tbs2.dbf'SIZE 50M REUSE

EXTENT MANAGEMENT LOCAL;