【DB笔试面试682】在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?...

【DB笔试面试682】在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?...

♣  

题目         部分

在Oracle中,Undo段中区3种状态分别是什么?


     


♣  

答案部分          


Undo信息存储在Undo段中,Undo段又存储在Undo表空间中。Undo表空间仅用于Undo段(在Undo表空间中不能创建其它段类型,例如表、索引等),只能与单个实例相关联。在任意指定时间,一个给定的实例只能有一个表空间是当前可写Undo表空间。Undo表空间是永久的、本地管理的表空间(具有自动区分配),它们由数据库自动进行管理。

Redo和Undo可以从以下几个方面进行区分:


Undo

Redo

记录内容

如何还原更改

如何重新生成更改

用于

事务回滚、实例恢复、一致性读、闪回

向前滚动数据库更改,例如数据库恢复(在实例恢复中利用Redo做前滚;在介质恢复中利用归档日志做RECOVER恢复操作实现完全或不完全恢复)、LogMiner、DG、OGG等

存储于

Undo段

Redo日志文件

避免

在多用户系统中读取不一致

数据丢失

Oracle Undo段中区3种状态(DBA_UNDO_EXTENTS的STATUS列):ACTIVE、EXPIRED和UNEXPIRED:

l ACTIVE即未提交的Undo信息(活动):表示事物还在活动,该值对应的Undo段的DBA_ROLLBACK_SEGS.STATUS一定是ONLINE状态,一旦没有活动的事务在使用Undo段,那么对应的Undo段就变成OFFLINE状态。ACTIVE状态的Undo区不会被覆盖。

l EXPIRED即过期的Undo信息(过期):表示事务已经提交且超过了UNDO_RETENTION指定时间,该状态可以被覆盖使用。

l UNEXPIRED即提交的Undo信息(未过期):表示事务已经提交但是还没有超过UNDO_RETENTION指定时间,该状态可以被覆盖使用。

关于Undo表空间有如下几个参数:

1SYS@orclasm > show parameter undo
2
3NAME                                 TYPE        VALUE
4------------------------------------ ----------- ------------------------------
5_undo_autotune                       boolean     FALSE
6undo_management                      string      AUTO
7undo_retention                       integer     900
8undo_tablespace                      string      UNDOTBS1

 

l UNDO_RETENTION参数指定已提交的Undo信息要保留多长时间(单位为秒),默认为900秒(即15分钟)。但是该值不是绝对的,也就是说,如果有其它事务需要Undo空间,而Undo空间出现不足时,这些信息仍然会被覆盖。只有当表空间设置为GUARANTEE时,才能确保已提交的数据保留UNDO_RETENTION参数设置的时间。RETENTION GUARANTEE是表空间属性而不是初始化参数,此属性只可使用SQL命令行语句来更改。通过更改Undo表空间来保证保留时间的语法是:

1SQL>ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;

 

要将有保留时间保证的还原表空间返回到其常规设置,请使用以下命令:

1SQL>ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;

 

查询保留时间状态:

1SQL> SELECT RETENTION FROM DBA_TABLESPACES WHERE TABLESPACE_NAME LIKE 'UNDO%';

 

如果设置UNDO_RETENTION为0,那么Oracle启用自动调整UNDO_RETENTION(auto tuning of undo_retention)以满足最长运行查询的需要,在告警日志文件中可以看到如下信息:

1Autotune of undo retention is turned on.

 

可以通过设置“"_undo_autotune"=FALSE”来显式的关闭自动调整UNDO_RETENTION功能。

l UNDO_MANAGEMENT参数用于指定Undo数据的管理方式,分为自动Undo管理(AUM,Automatic Undo Management)和手动Undo管理(MUM,Manual Undo Management)。如果要使用AUM,那么必须设置为AUTO;如果要使用MUM,那么必须设置为MANUAL。在使用AUM时,Oracle会使用Undo表空间管理Undo数据;在使用MUM时,Oracle会使用回滚段管理Undo数据。需要注意的是,在使用AUM时,如果没有配置初始化参数UNDO_TABLESPACE,那么Oracle会自动选择第一个可用的Undo表空间存放Undo数据,如果没有可用的Undo表空间,那么Oracle会使用SYSTEM回滚段存放Undo记录,并在告警文件中记录警告。

l UNDO_TABLESPACE 在使用AUM时,该参数用于指定实例所要使用的Undo表空间。在RAC结构中,因为一个Undo表空间不能由多个实例同时使用,所以必须为每个实例配置一个独立的Undo表空间。

有关Undo表空间的恢复请参考:http://blog.itpub.net/26736162/viewspace-1458787/,这里不再详述。有关Undo表空间常用的几个视图如下所示:

 1SELECT OWNER,SEGMENT_NAME,BYTES/1024/1024 MB FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='UNDOTBS1';
 2SELECT * FROM DBA_ROLLBACK_SEGS;
 3SELECT * FROM V$ROLLNAME;
 4SELECT * FROM DBA_UNDO_EXTENTS;
 5
 6SELECT TABLESPACE_NAME, STATUS, SUM(BYTES) / 1024 / 1024 "Bytes(M)"
 7  FROM DBA_UNDO_EXTENTS
 8 GROUP BY TABLESPACE_NAME, STATUS;
 9
10SELECT R.STATUS "Status",
11       R.SEGMENT_NAME "Name",
12       R.TABLESPACE_NAME "Tablespace",
13       S.EXTENTS "Extents",
14       TO_CHAR((S.BYTES / 1024 / 1024), '99999990.000') "Size"
15FROM   SYS.DBA_ROLLBACK_SEGS R,
16       SYS.DBA_SEGMENTS      S
17WHERE  R.SEGMENT_NAME = S.SEGMENT_NAME
18AND    S.SEGMENT_TYPE IN ('ROLLBACK', 'TYPE2 UNDO')
19ORDER  BY 5 DESC;
20
21SELECT R.NAME 回滚段名,
22       S.SID SID,
23       S.SERIAL# SERIAL,
24       S.USERNAME 用户名,
25       S.MACHINE 机器名,
26       T.START_TIME 开始时间,
27       T.STATUS 状态,
28       T.USED_UBLK 撤消块,
29       USED_UREC 撤消记录,
30       T.CR_GET 一致性取,
31       T.CR_CHANGE 一致性变化,
32       T.LOG_IO "逻辑I/O",
33       T.PHY_IO "物理I/O",
34       T.NOUNDO NOUNDO,
35       G.EXTENTS EXTENTS,
36       SUBSTR(S.PROGRAM, 1, 50) 操作程序  
37FROM   V$SESSION     S,
38       V$TRANSACTION T,
39       V$ROLLNAME    R,
40       V$ROLLSTAT    G
41WHERE  T.ADDR = S.TADDR
42AND    T.XIDUSN = R.USN
43AND    R.USN = G.USN
44ORDER  BY T.USED_UBLK DESC;

 


(二)系统回滚段(System Rollback Segment)与延迟回滚段(Deferred Rollback Segment)

SYSTEM回滚段创建在系统表空间中,当手工创建数据库后,在创建普通回滚段之前必须首先创建系统回滚段。但正常情况下,系统回滚段主要用于两个方面:一是系统事务,另一个就是延迟回滚段。延迟回滚段表示的是,当使一个表空间OFFLINE之后,由于表空间不可用(不能进行读写),这个时候若有事务数据位于该表空间并且执行了回滚命令,回滚完成将显示给Client,对于Client看起来该事务已经回滚,但是对于数据库来说该回滚并没有真正完成,这个时候数据库将该回滚信息写入系统回滚段(这就是延迟回滚段),等表空间重新ONLINE的时候,数据库从系统回滚段中将回滚信息写入表空间。


上一篇:【DB笔试面试180】在Oracle中,Undo的作用是什么?


下一篇:【DB笔试面试681】在Oracle中,什么是块清除(Block Cleanout)?