一、What is Undo
① 当发布一条回滚语句时,撤销记录用于撤销未提交事务读数据库所做的修改。
② 在数据库恢复期间,撤销记录用于撤销从重做日志作用到数据文件的任何未提交的修改。
③ 当另一用户正在修改数据时,撤销记录为正在访问数据的用户提供修改钱的映像。
注:一个数据库只有一个SYSTEM回滚段,通常在CREATE DATABASE时自动创建,并在实例启动时联机。
二、指定管理Undo TableSpace的方式
管理Undo TableSpace的方法有两种:一是使用回滚段来管理,该方式被认为是手动撤销管理;二是使用撤销表空间的方法,是以自动撤销管理方式。不能在一个数据库实例中同时使用两种方法,如要进行切换,则需要关闭和重启数据库。实例中使用何种管理方法,由初始化参数UND_MANAGEMENT决定。
1、自动撤销管理方式
UNDO_MANAGEMENT = AUTO
注:前提是一个撤销表空间必须是可用的。
① 实例启动时,Oracle自动选择第一个可用的撤销表空间。
② 如果没有撤销表空间,则启动时使用SYSTEM回滚段,但会有警告信息产生。
③ 可以启动时指定特定的撤销表空间,通过 UBDO_TABLESPACE 初始化参数约定。
其他相关初始化参数:
UNDO_RETENTION:保持撤销的时间长度动态参数,默认为900秒
UNDO_SUPPRESS_ERRORS:自动撤销管理方法下,发布手动撤销管理SQL语句时,是否发布错误信息。TRUE取出信息|FALSE发布信息
2、手动撤销管理方式
UNDO_MANAGEMENT = MANUAL (default)
注:此模式下UNDO_TABLESPACE参数值被忽略。
其他相关的初始化参数:
ROLLBACK_SEGMENTS:指定在启动时需要的回滚段
TRANSACTIONS:指定并发事务的最大个数
TRANSACTIONS_PER_ROLLBACK_SEGMENT:指定每个回滚段希望被处理的并发事务个数
MAX_ROLLBACK_SEGMENTS:指定可以为任何实例联机服务的回滚段最大个数
-----------------------------------------------------------------------------------
管理撤销表空间
Oracle强烈建议以自动撤销管理方式进行操作。
1、创建撤销表空间
① CREATE DATABASE 的 UNDO TABLESPACE 子句
若在CREATE DATABASE中没有UNDO TABLESPACE子句,则Oracle会自动创建一个名为SYS_UNDOTBS(9i)的默认撤销表空间,以自动撤销管理方式进行。SYS_UNDOTBS初始大小为10M,自动盘区。
创建语法:
CREATE DATABASE rbdb1
CONTROLFILE REUSE
...
UNDO TABLESPACE undotbs_01 DATAFILE '/u01/oracle/rbdb1/undo0101.dbf';
注:使用该子句后,若Undo TableSpace没有创建成功,则整个数据库新建操作失败。
② 使用 CREATE UNDO TABLESPACE 语句
CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u02/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;
注:与CREATE TABLESPACE语句基本一样。
2、修改撤销表空间
撤销表空间也可以通过ALTER TABLESPACE语句来进行修改,但是由于撤销表空间中大多数的方面都由系统自动管理,所以用户只需要进行以下的操作(也只允许用户进行这些属性的修改):
① 添加数据文件
② 数据文件重命名
③ 数据文件联机/脱机
④ 开始/结束数据文件的公开备份
注:具体操作与普通数据文件操作相同,不再举例。
3、取消撤销表空间
一个撤销表空间只有在没有被任何实例所使用的情况下才可以被取消。如果包含任何未完成的事务,则操作失败。
DROP TABLESPACE undotbs_01;
注:取消Undo TableSpace时相当于 DROP TABLESPACE ... INCLUDING CONTENTS
4、切换撤销表空间
ALTER SYSTEM SET UNDO_TABESPACE = undotbs_02;
命令执行后,会立即切换,但是需要注意以下几点:
① 该表空间必须存在
② 该表空间必须是一个撤销表空间
③ 该表空间不能被其他实例使用
因为切换操作不等待已有事务的提交,所以当切换操作完成之后,原先的Undo TableSpace进入PENDING OFFLINE状态,已经开始的事务可以继续进行操作,新事务则使用新的Undo TableSpace。
另外,可以使用 ALTER SYSTEM SET UNDO_TABLESPACE = ''; 来去掉Undo TableSpace。
5、为撤销空间确定用户限额
Oracle的Database Resource Manager的UNDO_POOL指令允许DBA限制一个用户组所消耗的撤销空间的数量。
可以为每个使用者组指定一个撤销池,一个撤销池控制由一个使用者产生的全部撤销数量。
当没有明确定义UNDO_POOL指令时,用户被允许使用没有限制的撤销表空间。
6、为撤销信息设置保留期
① 指定保留期
UNDO_RETENTION = 500 (default 900)
初始化参数 UNDO_RETENTION 可设置数据保留期。
UNDO_RETENTION参数是可以通过ALTER SYSTEM 来动态修改的。
该保留期的计算不受系统崩溃的影响,即实例崩溃前生成的撤销,一直保持到它的保留期过期,即使重新启动实例也是如此。
注:UNDO_RETENTION只有在Undo TableSpace有足够空间时才起作用。当空间不足时,系统开始重用未到期的撤销空间。
② 闪回查询的保留期
DBMS_FLASHBACK可以实现系统的闪回操作,即用户可以见到过去一个指定时间的一致版本。
闪回可以回退的时间最大长度,取决于撤销的保存时间长度,所以一般如果需要闪回在12小时的,则需要设置:
UNDO_RETENTION = 43200
③ 撤销保留的空间要求
通过一下公式计算撤销保留所需要的空间:
UndoSpace = UR * UPS + Overhead
UndoSpace = 撤销块数目
UR = 以秒计的 UNDO_RETENTION
UPS = 每秒的撤销块数
Overhead = 元数据的小开销 (事务表、位图等)
7、关于撤销空间的信息
V$UNDOSTAT:包括用来监听和调整撤销空间的统计信息
V$ROLLSTAT:自动撤销管理方式中撤销表空间中撤销段的行为
V$TANSACTION:撤销段的信息
DBA_UNDO_EXTENTS:撤销表空间中每个盘区的提交时间
监控撤销空间:
SELECT BEGIN_TIME, END_TIME, UNDOTSN, UNDOBLKS, TXNCOUNT, MAXCONCURRENCY "MAXCON"
FROM V$UNDOSTAT; --
监控某段时间内撤销空间的消耗情况
-The End-