/* 撤销表空间 */
通过使用撤销技术,能够为Oracle数据库提供以下功能:
* 使用ROLLBACK语句撤销事务
* 进行数据库恢复
* 提供数据的读一致性
Oracle强烈建议DBA在Oracle 9I数据库中应用自动撤销管理方式,任何数据库用户都不能在撤销表空间中创建对象,在撤销表空间中只能保存撤销记录.
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
undo_management--auto 自动撤销管理方式(撤销表空间方式)
--manual 手工撤销管理方式(回退段方式)
undo_retention -- 撤销记录保存的最长时间
创建和管理撤销表空间
1.在创建数据库时建立撤销表空间
create database db01
......
undo tablespace undotbs01
datafile 'i:/oracle/oradata/undotbs0101.dbf'
....;
2.在数据库建立之后创建撤销表空间
create undo tablespace undotbs02
datafile 'i:/oracle/oradata/undotbs0201.dbf'
autoextend on;
(建议将撤销表空间的数据文件增长方式设置为自动增长方式)
修改撤销表空间
用户只能对撤销表空间进行如下操作
* 添加新的数据文件
* 重命名数据文件
* 更改数据文件大小
* 将数据文件切换为联机或脱机状态
alter tablespace undotbs01
add datafile 'i:/oracle/oradata/undotbs0102.dbf'
autoextend on
next 1M
MAXSIZE UNLIMITED;
alter database
datafile 'i:/oracle/oradata/undotbs0101.dbf'
resize 500M;
删除撤销表空间
(只有在撤销表空间没有被数据库使用时才能删除,如果撤销表空间中包含有未决事务的撤销记录,也不能删除表空间)
drop tablespace untotbs01;
drop tablespace untotbs01 include contents and datafiles;
切换撤销表空间(undo_tablespace是一个动态初始化参数)
alter system set undo_tablespace = undotbs02;
如果存在下列情况,上面的切换操作将产生错误:
* 指定的撤销表空间不存在
* 指定的表空间不是一个撤销表空间
* 指定的表空间正在被其它实例使用
在成功的切换撤销表空间后,任何新开始的事务都将在新的撤销表空间中保存撤销记录,但是在旧的撤销表空间中可能还保留
有当前未提交的撤销记录
undo_retention参数:指定撤销记录的保留时间,以秒为单位,是一个动态参数
如:将保留时间设置为30分钟 undo_retention = 1800
alter system set undo_retention = 600;
注意:撤销记录在撤销表空间中保留的时间并不一定大于UNDO_RETENTION参数说指定的时间,如果在新事务开始时,撤销表
空间已经被写满,新事务将覆盖已提交事务的撤销记录,即使这些撤销记录还未过期.因此,如果为UNDO_RETENTION参数设置了较大的值,那么必须保证撤销表空间具有足够的存储空间.
当oracle无法利用撤销(回退)记录来保证数据的读一致性时,将产生“快照太旧”错误.
这个错误通常发生在执行一个运行时间很长的查询时,由于与查询所需相关的撤销记录已经被覆盖,因此Oracle无法为查询提供正确的读一致性视图.
假设有这样的情况:
用户SCOTT对EMP表进行了更新,但是他还没提交更新事务,EMP表中更新前的数据被保存在SCOTT事务的撤销记录中.
这时,如果有另外一个用户JAKE也开始访问EMP表,Oracle将利用这些撤销记录来提供EMP表中数据的读一致性视图.假设JAKE的查询会持续很长一段时间,Oracle将持续用到这些撤销记录。在这个过程中,SCOTT用户可以提交他的事务,事务提交后,存储在撤销表空间(或回退段)中的SCOTT事务的撤销记录被标记为失效,它可能会被其它事务的撤销记录所覆盖,或者在Oracle缩减回退段时被释放,这时JAKE用户的查询如果还没有结束,可能会产生“快照太旧”错误.
解决办法:
* 在手工撤销管理方式下,DBA必须为运行时间较长的查询指定一个较大的回退段(具有较大的MINEXTENTS和OPTIMAL参数值的回退段).
* 在自动撤销管理方式下,DBA只需要指定一个较大的UNDO_RETENTION参数值,并且保证撤销表空间具有足够的存储空间.
撤销表空间数据字典
v$undostat 包含所有撤销表空间的统计信息,用于对撤销表空间进行监视和调整,DBA可以利用这个视图
来估算撤销表空间的大小
v$rollstat 在自动撤销管理方式下,可以利用该视图来查询关于撤销表空间的各个撤销段的信息
v$transaction 关于各个事务所使用的撤销段的信息
/* 管理回退段 */
如果为数据库建立多个回退段,Oracle会将事务平均分配给各个回退段,这样能够显著地提高系统地回退处理性能.
创建回退段
create rollback segment rbs_02 tablespace rbstbs
storage(initial 100K
next 100k
optimal 5M
pctincrease 0
minextents 20
maxextents 100);
(pctincrease存储参数要为0,将initial和next参数设置为相同的值,这样回退段中所有的区都应当具有相同的大小,optimal参数的值不能小于initial+next*(minextents-1),如果不设置的话,ORACLE将使用NULL做为默认值,为MINEXTENTS参数设置一个较大的值,不要将MAXEXTENTS参数设置为UNLIMITED,可以避免由于出现一个异常事务而导致为回退段分配过多的存储空间)
新建的回退段如果要做为私有回退段使用,可以将它的名称添加到初始化参数ROLLBACK_SEGMENTS中
ROLLBACK_SEGMENTS = (rbs_01,rbs_02)
更改回退段的存储参数
alter rollback segment rbs_02
storage (maxextents 120);
alter rollback segment rbs_02
storage(optimal 8M);
缩减回退段
如果在创建回退段时通过设置OPTIMAL存储参数指定了最优大小,ORACLE会在回退段超过最优大小时自动缩减回退段,DBA也可以手工缩减回退段,回退段
的缩减操作只有在没有活动事务使用该回退段时进行
假设回退段RBS_02的最优大小为5M
alter rollback segment rbs_02 shrink to 5M
显示分配回退段
set transaction use rollback segment large_bs01
(set transaction语句必须是事务的第一条执行语句)
删除回退段(必须先让它脱机,如果回退段处于任何非OFFLINE状态,都不能对它执行删除操作,之后必须在rollback_segment参数中也删除)
drop rollback segment rbs_02
回退段数据字典:
dba_rollback_segs 所有回退段的信息
v$rollname 所有联机回退段的名称
管理回退段的重要工作之一就是设置一个合理的OPTIMAL参数值,DBA可以首先通过查询V$ROLLSTAT视图以获得该回退段的AVEACTIVE字段值,然后将
OPTIMAL的值设置为稍稍高于AVEACTIVE值.