【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的时候,数据库从系统回滚段中将回滚信息写入表空间。
标签:...,NAME,DB,UNDO,Undo,回滚段,空间,RETENTION 来源: https://blog.51cto.com/lhrbest/2707327