一、What is undo

Every Oracle database must have a method of maintaining information that is used to roll back, or undo, changes to the database. Such information consists of records of the actions of transactions, primarily before they are committed. Oracle refers to these records collectively as undo.

Undo信息主要用途:

l   Roll back transactions when a ROLLBACK statement is issued.

l   Recover the database.

l   Provide read consistency.

l   Analyze data as of an earlier point in time by using Oracle Flashback Query.

l   Recover from logical corruptions using Oracle Flashback features.

当发出ROLLBACK指令时,undo信息被用来undo掉未提交的事务对数据库造成的改变。

在数据库恢复期间,undo信息被用来undo掉所有未从redo log提交到数据文件的事务。

当用户访问一些数据,而这些数据正被其他用户修改时,undo通过维护数据的前镜像(before image)来提供读一致。

 

 

二、指定Undo的管理方式(undo space management)

Oracle提供两种方式来存储undo信息:

l  Manual undo management mode:以前(9i以前),Oracle使用回滚段(rollback segments存储undo信息,这种回滚段管理方式非常复杂。

l  Automatic undo management mode Oracle9i以后使用另外一种方法来存储undo信息,即使用undo tablespace

在数据库中,同一时刻只能使用一种方式。当需要在两种方式中切换时,必须重启系统。

注意Oracle始终使用一个SYSTEM回滚段来执行系统事务。只有一个SYSTEM回滚段,它在创建数据库时自动被创建,而且总是在实例启动时被online。不需要对SYSTEM回滚段进行任何操作。

 

Oracle使用初始化参数UNDO_MANAGEMENT来指定使用哪种方式管理Undo。当参数设置为MANUAL时,使用回滚段方式;当设置为AUTO时,使用undo表空间方式。Oracle推荐为AUTO

 

Oracle 9i:如果UNDO_MANAGEMENT初始化参数没有指定值,则实例使用MANUAL模式。即使指定了UNDO_TABLESPACE初始化参数,也会忽略UNDO_MANAGEMENT参数。

Oracle 10g

UNDO_MANAGEMENTIf AUTO,use automatic undo management. The default is MANUAL.

Oracle 11g

UNDO_MANAGEMENTIf AUTO or null, enable automatic undo management. If MANAUAL,sets manual undo managemtne mode. The default is AUTO.

 

1AUTO管理模式

UNDO_MANAGEMENT=AUTO时,数据库启动时,实例将使用AUTO管理方式。

必须要有可用的undo tablespace来存储undo信息。这个表空间可以在数据库创建时产生,也可以在数据库创建后再创建。

实例启动时,oracle自动选择第一个可用的undo表空间,如果没有可用的undo表空间,实例就会使用SYSTEM回滚段。这种情况是不被推荐的,系统会在alert.log文件中记录一条警告信息。

 

使用初始化参数UNDO_TABLESPACE指定系统使用哪一个undo表空间来存放undo信息。如果指定了undo_tablespace的值,但是系统中不存在这样的表空间,那么系统启动将会失败。此时,如果系统中存在undo表空间,为undo_tablespace指定正确的undo表空间名字,或者将undo_tablespace注释,系统会采用存在的undo表空间。否则使用手动方式。

 

2MANUAL管理模式

UNDO_MANAGEMENT=MANUAL时,数据库启动时,实例将使用MANUAL管理方式。

如果UNDO_MANAGEMENT初始化参数没有指定值,则实例使用MANUAL模式。即使指定了UNDO_TABLESPACE初始化参数,也会忽略UNDO_TABLESPACE参数。

 

当实例启动时,系统根据以下几个参数来确定online的回滚段的数量:

l   ROLLBACK_SEGMENTS:为实例指定一个或多个回滚段。

l   TRANSACTIONS:指定系统中最大的并发事务数。当UNDO_MANAGMENT=MANUAL时,指定系统中online回滚段的数量。系统最大并发事务数受限制于undo tablespace的大小(当UNDO_MANAGEMENT=AUTO时)和online rollback segments的数量(当UNDO_MANAGEMENT=MANUAL时)。

l   TRANSACTIONS_PER_ROLLBACK_SEGMENT:指定每一个回滚段支持的并发事务数。回滚段最小数量=TRANSACTIONS/ TRANSACTIONS_PER_ROLLBACK_SEGMENT:指明系统支持的最大的online回滚段的数目。

 

 

三、管理undo tablespace

1Undo Retention Period(undo保留期)Retention Guarantee

当事务提交后,undo数据就不再被rollbacktranaction recovery所需要。但是,出于读一致的目的,长查询可能会需要这些老的undo信息。此外,oracle的几种flashback也依赖于这些older undo information。因此就希望undo信息保留时间尽可能长。

在自动undo管理方式下,有undo retention period(undo保留期),它指定old undo information在被覆盖之前要保留的最小时间(Oracle attempts to do this)注意:只是指定undo 数据的过期时间Old(committed) undo information that is older than the current undo retention period is said to be expired. Old undo information with an age that is less than the current undo retention period is said to beunexpired.

Oracle数据库根据undo表空间大小和系统的活动程度自动调整undo保留期。你可以指定一个最小的保留期(单位:秒),通过UNDO_RETENTION初始化参数(默认900秒,即15分钟)注意,undo_retention只是指定undo数据的过期时间。并不是undo数据一定会在undo表空间中保存该时间值。当新事务可用空间变少时,数据库开始覆盖expired undo。如果所有的expired undo都已经被覆盖,而undo表空间依然没有空间时,数据库就开始覆盖unexpired undo。如果被覆盖的undo信息被一个长查询的读一致请求,则该查询会收到snapshot too old的错误信息。

 

UNDO_RETENTION参数对undo保留期的具体影响如下:

l   undo表空间大小为固定值时,UNDO_RETENTION参数被忽略。

l   undo表空间为AUTOEXTEND时,如果undo表空间不够用,oracle不覆盖unexpired undo信息,而是自动扩展undo表空间。如果自动扩展的undo表空间设置了MAXSIZE,这个最大值达到时,oracle就开始覆盖unexpired undo信息。

 

Retention Guarantee

为了确保长查询或flashback操作的成功,可以指定retention guarantee,它可以确保指定的最小保留期。oracle将从不覆盖unexpired undo数据,即使事务由于undo表空间不够用而失败。

CREATE DATABASECREATE UNDO TABLESPACE时,可以指定RETENTION GURANTEE子句,来启用retention guarantee,也可以在ALTER TABLESPACE使用此子句。关闭语句为RETENTION NOGUARANTEE

可以通过DBA_TABLESPACES视图查看undo表空间是否启用了retention guarantee

SQL> select tablespace_name,retention from dba_tablespaces;

 

TABLESPACE_NAME                RETENTION

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

SYSTEM                         NOT APPLY

UNDOTBS1                       NOGUARANTEE

SYSAUX                         NOT APPLY

TEMP                           NOT APPLY

USERS                          NOT APPLY

TS1                            NOT APPLY

已选择6行。

 

2、创建undo tablespace

有两种方式创建undo tablespace

l   创建数据库时创建undo tablespace

l   在已存在的数据库中创建。

 

创建数据库时创建undo tablespace

使用DBCA创建数据库时自动创建了undo tablespace。手动创建数据库时,在CREATE DATABASE语句中指定undo tablespace子句来创建,但是这个子句不是必须的。如果在创建数据库时,系统指定为auto模式,但是没有指明undo tablespace的名字,那么系统会创建一个默认的undo表空间,名称叫sys_undotbs。这个表空间根据Oracle定义的缺省值创建,初始大小为10M,可以自动扩展。不过Oracle推荐最好还是使用一个指定的大小。

CREATE DATABASE rdbd1

CONTROLFILE REUSE

...

UNDO TABLESPACE undotbs_01 DATAFILE ‘/u01/oracle/rdbd1/undo0101.dbf’;

注意:如果此时系统创建undo失败,那么整个创建数据库的命令会失败。需要删除已经创建的数据文件,纠正错误,重新创建数据库。

 

使用create undo tablespace创建:

CREATE UNDO TABLESPACE undotbs_02

DATAFILE ‘/u01/oracle/rdbd1/undo0201.dbf’ SIZE 2M REUSE

AUTOEXTEND ON;

 

3Undo tablespace相关操作

1)、增加数据文件

ALTER TABLESPACE undotbs_01

ADD DATAFILE ‘/u01/oracle/rbdb1/undo0102.dbf’ AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

 

2)、重命名数据文件

ALTER TABLESPACE undotbs_01

RENAME DATAFILE ‘/u01/oracle/rbdb1/undo0102.dbf’ TO ‘/u01/oracle/rbdb1/undo0101.dbf’;

 

3)、使数据文件onlineoffline

ALTER TABLESPACE undotbs_01 online|offline;

 

4)、开始或结束一个联机备份

ALTER TABLESPACE undotbs_01 BEGIN|END BACKUP;

 

5)、删除undo tablespace

DROP TABLESPACE undotbs_01;

Drop undo表空间的时候必须是在未使用的情况下才能进行。如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。

DROP TABLESPACE for undo tablespaces behaves like DROP TABLESPACE...INCLUDING CONTENTS. All contents of the undo tablespace are removed.

 

6)、切换undo tablespace

ALTER SYSTEM SET UNDO_TABLESPACE=undotbs_02;

一下情况会导致表空间切换失败:

l   表空间不存在;

l   表空间不是undo表空间;

l   表空间正在被其他实例使用(in an Oracle RAC environment only)

注意:切换操作不等待旧undo表空间的事务提交。如果旧undo表空间有事务未提交,那么旧的undo表空间进入pending offline状态,在这种模式下所有的事务能够继续进行,但是undo表空间不能被其他实例使用,也不能被删除,直到所有的事务提交后,undo表空间才进入offline模式。

 

7)、设置undo_retention

ALTER SYSTEM SET UNDO_RETENTION=2400;

 

8)、undo表空间大小的设计计算公式

UndoSpace = UR*UPS*db_block_size + overhead

UR: is UNDO_RETENTION in seconds.

UPS: is undo blocks for each second.

overhead(冗余量)is the small overhead for medata(transaction tables,bitmaps,and so forth).

相关统计信息可以从下述动态性能视图v$undostat中查询。

 

9)、和undo相关的视图

l   v$undostat:包含undo space的统计信息。

l   v$rollstatundo表空间的undo segments的统计信息。

l   v$transaction:包含undo segment信息。

l   dba_undo_extentsundo表空间的每一个extent的大小、状态信息。

l   dba_hist_undostat:包含v$undostat的统计快照信息。

v$undostat视图对于监视当前实例事务在undo空间的状况非常有用。视图中的每一行代表实例每隔十分钟的一个统计信息。该视图一共可包含576行,跨越4天一个周期。

 

 

四、管理Rollback Segments

1、回滚段相关操作

1)、创建回滚段

创建回滚段必须要有CREATE ROLLBACK SEGMENT系统权限。

CREATE ROLLBACK SEGMENT rbs_01

TABLESPACE rbsspace

STORAGE(

 INITIAL 100K

NEXT 100K

OPTIMAL 4M

MINEXTENTS 20

MAXEXTENTS 100 );

 

2)、修改回滚段

修改回滚段必须要有ALTER ROLLBACK SEGMENT系统权限。

使回滚段onlineoffline

ALTER ROLLBACK SEGMENT RB01 ONLINE;

 

修改存储参数:

ALTER ROLLBACK SEGMENT RB01 STORAGE(MAXEXTENTS 200 OPTIMAL 2048K);

 

收缩回滚段:

ALTER ROLLBACK SEGMENT RB01 SHRINK;

注意:有OPTIMAL参数时,缩小到OPTIMAL值;没有OPTIMAL参数时,缩小到MINEXTENTS所对应的值。

ALTER ROLLBACK SEGMENT RB01 SHRINK TO 2048K;

ALTER ROLLBACK SEGMENT RB01 STORAGE(MAXEXTENTS 120);

 

3)、删除回滚段

删除回滚段必须要有DROP ROLLBACK SEGMENT系统权限。

原则上,INITIAL总应该等于NEXT,除了使用SET TRANSACTION USE ROLLBACK SEGMENT XXX的回滚段。由于INITIAL不能直接修改,只能先drop然后创建。

DROP ROLLBACK SEGMENT RB01;

CREATE ROLLBACK SEGMENT RB01 TABLESPACE RBS1

STORAGE(INITIAL 100K NEXT 100K MINEXTENTS 20 MAXEXTENTS 121 OPTIMAL 2000K);

 

在事务中使用特定的回滚段:

SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;

通过这个命令,可以:

更具事务量的大小,决定使用哪一个回滚段;

将大的查询的事务放入单独的回滚段;

当存在大的查询使用事务时,可以将它放入大的回滚段。

 

2、和回滚段相关的视图

DBA_ROLLBACK_SEGS:描述回滚段的信息,包含回滚段的名字和表空间。

DBA_SEGMENTS:描述回滚段的附加信息。

V$ROLLNAME:列出在线回滚段的名称。

V$ROLLSTAT:包含回滚段的统计信息。

V$TRANSACTION:包含撤销的统计信息。