OCP-031-Chapter10 管理回滚段(还原段)
目的
完成本课后,应该可以做下列事情:
描述回滚数据的用处
实施自动的回滚管理
创建和配置回滚段
从数据字典中取得回滚段的信息
两种管理方式:自动和手动,课程里面仅讨论自动管理
还原段用于在进程更改数据库中的数据时保存旧值(要还原的数据)。它按数据被修改之前的原样存储数
据的位置及数据本身。
还原段的标头包含一个事务处理表,该表中存储着有关使用这个还原段的当前事务处理的信息。
一个连续的事务处理只使用一个还原段存储它的全部还原数据。
许多并发事务处理可以写入一个还原段。
还原段:用途
事务处理回退
事务处理恢复
如果例程在事务处理正在进行时失败,那么 Oracle 服务器需要在数据库再次打开时还原所有未提交的更
改。这种回退操作是事务处理恢复的一部分。之所以有可能恢复事务处理,原因在于对还原段所做的更改
同样受重做日志文件的保护。
读一致性
Oracle 服务器保证一条语句所看到的数据来自一致的时间,即使其它事务处理修改了该数据。
当 Oracle 服务器开始执行 SELECT 语句时,它确定当前系统更改号 (SCN),并确保这个 SCN 之前未提交
的任何更改不会被这条语句处理。请考虑在进行多个更改的同时执行长时间运行的查询的情况。如果在这
次查询开始时某行有未提交的更改,Oracle 服务器会构建该行的读一致性映像,方法是从还原段检索这些
更改的前像,并将更改应用于内存中该行的副本。
SYSTEM 还原段
创建数据库时,将在 SYSTEM 表空间中创建 SYSTEM 还原段。这个还原段只用于对 SYSTEM 表空间中的对
象所做的更改。SYSTEM 还原段在手动模式和自动模式下的存在和工作是一样的。
非 SYSTEM 还原段
具有多个表空间的数据库至少需要一个非 SYSTEM 还原段用于手动模式,或至少需要一个 UNDO 表空间用
于自动模式。
手动模式
在手动模式下,由数据库管理员创建的非 SYSTEM 还原段可用于对任何非 SYSTEM 表空间中的对象所做的
更改。非 SYSTEM 还原段有以下两种类型。
专用
因为专用还原段列在参数文件中,所以它们是通过例程联机的段。但是,通过发出 ALTER ROLLBACK
SEGMENT 命令,可以使它们显式联机。
公用
公用还原段形成了数据库中可用还原段的池。公用还原段通常与 Oracle Real Application Clusters 一
起使用来创建还原段池,这个池可以由任何 “实时应用集群” (Real Application Clusters) 例程使用
。
延迟还原段
当表空间脱机时,可能会创建延迟还原段。它们用于在表空间恢复联机时回退事务处理。当不再需要这些
延迟还原段时,它们将自动被删除。
因为延迟还原段是由 Oracle 服务器来维护的,所以您无需进行维护。
还原数据是使用 UNDO 表空间来管理的。
您可以为每个例程分配一个 UNDO 表空间,还要针对例程的工作量分配足够的空间。
Oracle 服务器自动维护 UNDO 表空间内的还原数据。
配置初始化文件中的两个参数:
UNDO_MANAGEMENT
UNDO_TABLESPACE
至少创建一个 UNDO 表空间。
如果数据库中只有一个 UNDO 表空间,并且将 UNDO_MANAGEMENT 设置为 AUTO,则 UNDO_TABLESPACE 参数
是可选的;Oracle 服务器将自动选择 UNDO 表空间。
自动还原管理需要一个 UNDO 表空间。数据库中可能有多个 UNDO 表空间,但只能有一个 UNDO 表空间处
于活动状态。
您可以在创建数据库时一起创建 UNDO 表空间,方法是,在 CREATE DATABASE 命令中 添加一个子句。
在创建数据库期间,如果将 UNDO_MANAGEMENT 参数设置为 AUTO 并在 CREATE DATABASE 语句中省略了
UNDO 表空间子句,那么 Oracle 服务器将创建一个名为 SYS_UNDOTBS 的 UNDO 表空间。数据文件表空间
SYS_UNDOTS 的缺省数据文件名称是 ‘dbu1<oracle_sid>.dbf’。该文件位于 $ORACLE_HOME/dbs 中。文
件的大小取决 于操作系统。将 AUTOEXTEND 设置为 ON。
创建完数据库后,您可以使用 CREATE UNDO TABLESPACE 命令创建 UNDO 表空间。
CREATE DATABASE db01
. . .
UNDO TABLESPACE undo1
DATAFILE '/u01/oradata/undoldb01.dbf' SIZE 20M
AUTOEXTEND ON;
CREATE UNDO TABLESPACE undo1
DATAFILE '/u01/oradata/undo1db01.dbf'
SIZE 20M;
改变 UNDO 表空间时,服务器为下列子句提供支持。
ADD DATAFILE
RENAME
DATAFILE [ONLINE|OFFLINE]
BEGIN BACKUP
END BACKUP
可以从使用一个 UNDO 表空间切换到使用另一个 UNDO 表空间。
一次只能将一个 UNDO 表空间分配给某个数据库。
一个例程中可以存在多个 UNDO 表空间,但只能有一个处于活动状态。
使用 ALTER SYSTEM 命令,可以在各个 UNDO 表空间之间进行动态切换。
ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2;
移除还原表空间
Drop tablespace undotbs2;
只有当前没有被任何实例使用的UNDO表空间才可以被移除
对于正在使用的undo表空间,如果要移除,那么首先必须切换到其他UNDO表空间,然后使用下面的语句查
询,直到任何行返回为止。
SQL> SELECT a.name,b.status
2> FROM v$rollname a, v$rollstat b
3> WHERE a.name IN ( SELECT segment_name
4> FROM dba_segments
5> WHERE tablespace_name = 'UNDOTBS'
6> )
7> AND a.usn = b.usn;
NAME STATUS
------------------------- ---------------
_SYSSMU4$ PENDING OFFLINE
如果删除后还有事务的读一致性信息参考该表空间,会收到错误:ORA-1555 snapshot too old.
UNDO_SUPPRESS_ERRORS启用后可以防止自动模式下手动命令产生的错误信息,类似于:
ORA-30019: Illegal rollback Segment operation in Automatic
Undo mode
UNDO_RETENTION设定保留多少数据以提供读一致性,这有助于比较长的查询,同时也需要较大的UNDO表空
间。设定的单位为s。
ALTER SYSTEM SET UNDO_RETENTION=900;
SELECT end_time,begin_time,undoblks
FROM v$undostat;
会显示系统工作统计数据的频率分布,缺省10分钟为间隔,可以通过这里的信息估算系统当前工作负载下
面所需要的UNDO表空间。数据库也会使用这个视图调整还原空间的使用。
设定UNDO表空间的大小
需要三个数值:
(UR) UNDO_RETENTION 以秒为单位的 UNDO_RETENTION
(UPS) Number of undo data blocks generated per second 每秒生成的还原数据块的数量
(DBS) Overhead varies based on extent and file size (db_block_size) 开销随着区大小和文件大小
(db_block_size) 变化
UndoSpace = [UR * (UPS * DBS)] + (DBS * 24)
SELECT (SUM(undoblks) / SUM( ((end_time - begin_time) * 86400)
FROM v$undostat;
列 END_TIME 和 BEGIN_TIME 属于 DATE 数据类型。如果对 DATE 数据类型做减法,则计算结果是天数。
要将天数转换成秒数,乘以一天所包含的秒数 86400 即可。
查询结果返回每秒生成的还原块的数量。这个值需要乘以还原块的大小,还原块大小与 DB_BLOCK_SIZE 中
定义的数据库块的大小相同。下面的查询计算的是所需的字节数:
SQL> SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"
2> FROM (SELECT value AS UR
3> FROM v$parameter
4> WHERE name = 'undo_retention'),
5> (SELECT (SUM(undoblks)/SUM(((end_time -
begin_time)*86400))) AS UPS
6> FROM v$undostat),
7> (SELECT value AS DBS
8> FROM v$parameter
9> WHERE name = 'db_block_size');
使用资源计划,可以对用户进行分组,并对某个组可使用的资源数量加以限制。可以对某个组生成的还原
数据量进行限制,方法是设置 UNDO_POOL 的值:缺省值是无限大
要获取有关数据库中所有还原段的信息,请查询 DBA_ROLLBACK_SEGS 视图:
SQL> SELECT segment_name,owner,tablespace_name,status
2 FROM dba_rollback_segs;
有关脱机的还原段的信息只能在 DBA_ROLLBACK_SEGS 中看到。动态性能视图只显示 联机还原段。
OWNER 列指定还原段的类型:
SYS:指专用还原段
PUBLIC:指公用还原段
联接 V$ROLLSTAT 和 V$ROLLNAME 视图以获取例程当前使用的还原段的统计数据。
示例:
SQL> SELECT n.name, s.extents, s.rssize,s.hwmsize,
2 s.xacts, s.status
3 FROM v$rollname n, v$rollstat s
4 WHERE n.usn = s.usn;
要检查活动事务处理当前使用的还原段的情况,请联接 V$TRANSACTION 和 V$SESSION 视图
SQL> SELECT s.username, t.xidusn, t.ubafil,
2 t.ubablk, t.used_ublk
3 FROM v$session s, v$transaction t
4 WHERE s.saddr = t.ses_addr;

