创建undo talespace有两种方式:
(1)数据库创建时创建undo tablespace;
(2)在一个已经存在的数据库创建。
在undo tablespace中不能创建数据库对象,这是因为这个表空间是为数据库recover而准备的。
1、创建数据库时创建undo tablespace
在创建数据库的时候可以通过指定undo子句来创建undo tablespace,但是这个子句不是必须的。
如果在创建数据库时,系统指定是auto模式,但是没有指明undo tablespace的名字,那么系统会创建一个默认的回滚表空间,名称叫sys_undotbs。这个表空间根据oracle定义的缺省值创建。初始化大小是10m,可以自动扩展。不过oracle推荐最好还是使用一个指定的大小。
CREATE DATABASE rbdb1
CONTROLFILE REUSE
...
UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';
注意:如果此时系统创建undo失败,那么整个创建数据库的命令就失败了。此时
Dba需要删除已经创建的数据文件,纠正错误,重建创建数据库。
使用create undo tablespace子句创建
CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE
AUTOEXTEND ON;
2、Undo 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)使数据文件online或者offline
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表空间的时候可以使用including contents。
(6)切换undo tablespace
切换undo表空间有两种方式:
a、使用命令动态修改;
b、修改初始化参数后重新启动数据库。
Alter system set undo_tablespace=undotbs1;
当切换命令完成后,所有的事务就会在新的回滚表空间内进行。
以下几种情况会导致切换命令失败:
a、表空间不存在;
b、表空间不是一个回滚段表空间;
c、表空间已经被另一个实例使用。
注意:切换的操作不等待旧undo表空间的事务提交。如果旧undo表空间有事务未提交,那么旧的undo表空间进入pending offline状态,在这种模式下所有的事务能够继续进行,但是undo表空间不能被其他实例使用,也不能被删除,直到所有的事务提交后, undo表空间才进入offline模式。
(7)设置undo_retention
dba可以设置undo_retention初始化参数指定undo回滚表空间保留undo信息的时间。在设置好这个参数时,系统会保留undo信息在指定的时间断后才收回这个空间。
一般情况下,系统会保留undo信息到指定的时间后才回收空间,但是,如果系统
存在大量的事务,也会将未到期的undo空间回收,以供使用。
(8)Undo 表空间大小的设计规范的计算公式
Undospace = UR * UPS *db_block_size+ 冗余量
UR: 表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。
UPS:表示在undo中,每秒产生的数据库块数量。
和undo有关的动态性能视图v$undostat 包含undo的统计信息。使用这张视图可以估计系统当前所需的undo大小。
v$rollstat 是undo模式的视图。是undo表空间的undo segments的统计信息
v$transaction 包含undo segments的信息。
dba_undo_extents 包含undo表空间中每一个范围的提交时间。