您的位置:首页 > 其它

UNDO管理之三UNDO相关数据字典

2012-08-27 15:44 351 查看
UNDO相关数据字典 
UNDO相关数据字典概览 
V$ROLLNAME与V$ROLLSTAT 
V$UNDOSTAT 
DBA_UNDO_EXTENTS 
数据字典的应用 
得到活动事务的UNDO使用情况 
查询UNDO表空间的使用情况 
延伸阅读 

UNDO相关数据字典
UNDO相关数据字典概览

    9i是Oracle UNDO管理上面的一个分水岭,从手工管理到自动管理的分水岭。而与UNDO管理相关的数据字典也从手工UNDO管理的时代
延续到了自动UNDO的时代,进入AUM时代之后,Oracle也新增了几个新的数据字典,但是那些延续下来的数据字典依然在UNDO的
管理中发挥着重要的作用。

与UNDO相关的数据字典可以分成下面几类:
1.	与UNDO管理直接相关的数据字典 
o	9i之前手工管理时就存在的数据字典

	V$ROLLNAME:回滚段名称和回滚段ID对应表。

	V$ROLLSTAT:在使用AUM时,该视图保存着所有UNDO表空间中每一个已分配的回滚段当前状态以及相关的统计信息,
        不显示状态在OFFLINE的回滚段。

	DBA_ROLLBACK_SEGS:此字典显示所有回滚段的当前状态以及与存储空间分配相关的信息。

o	9i之后新增的数据字典

	V$UNDOSTAT:保存了某一时间段的整个UNDO表空间使用的统计信息以及UNDO自动优化的结果,默认情况下每10分钟
        增加一条记录,并只保留最近的576条(4天。在10g及之前版本中此记录为1008,或7天)的信息,超过期限的数据
	只能在DBA_HIST_UNDOSTAT中找到。此字典仅对自动UNDO管理模式有效。

	DBA_UNDO_EXTENTS:保存了UNDO表空间中所有已分配的数据区的存储空间分配情况与使用情况,是得到UNDO数据
        当前存在状态的一个重要的视图。
	DBA_HIST_UNDOSTAT:保存了所有V$UNDOSTAT所存在的数据的一个历史记录,10g开始新增字典。

2.	与UNDO管理间接相关的数据字典 
o	事务相关 
	V$TRANSACTION:当前正在进行事务的信息,与UNDO管理相关的是当前事务所涉及的UNDO段,UNDO空间占用等等信息。
o	UNDO表空间相关 
	DBA_EXTENTS:与DBA_UNDO_EXTENTS类似。
	DBA_SEGMENTS:与DBA_ROLLBACK_SEGS类似。
	DBA_DATA_FILES:关联计算UNDO表空间大小而用。

       UNDO表空间实质上和其他普通表空间一样,因此适用于其他表空间的数据字典都适用于UNDO表空间。
字典V$ROLLSTAT和V$UNDOSTAT在名字上面看起来有点rollback segment与UNDO segment的感觉,但是实际上这两个视图的差别还是
很大的
    V$ROLLSTAT记录的是整个UNDO表空间各个回滚段使用情况的统计,属于横向的;
    V$UNDOSTAT记录的则是各个时间段上面整个UNDO使用情况的统计,属于纵向的。

V$ROLLNAME与V$ROLLSTAT

V$ROLLNAME其实没什么可说的,就是一个回滚段名和回滚段ID的对应表,在使用V$ROLLSTAT的时候要用到。
下面列举下V$ROLLSTAT中一些比较有用的字段:

USN
回滚段的ID,与V$ROLLNAME关联可以查询到相关的回滚段名称。

WRITES
写入到回滚段中的数据的大小,单位为bytes。

XACTS
回滚段上面存在的活动事务的数量。

GETS
对回滚段头的请求次数。

WAITS
对回滚段头的请求中发生等待的次数。

EXTENDS
回滚段获取新的数据区的次数。

STATUS
该回滚段当前的状态,可用的状态包括: 
•	ONLINE:在线,可以正常使用。
•	PENDING OFFLINE:等待离线,通常在切换UNDO表空间的时候出现。
•	OFFLINE:离线,不可用,在AUM下通常为非当前UNDO空间中的回滚段。
•	FULL:已满,这个在AUM通常是UNDO表空间无法扩展时出现。

SQL> SELECT rs.usn, rn.name, rs.gets, rs.writes, 
  2    rs.xacts, rs.waits, rs.extends, rs.status 
  3  FROM v$rollname rn, v$rollstat rs 
WHERE rn.usn=rs.usn 
ORDER BY xacts DESC;  4    5 
  
USN NAME                     GETS     WRITES  XACTS   WAITS  EXTENDS STATUS 
--- ---------------------- ------ ---------- ------ ------- -------- ------ 
 91 _SYSSMU91_1273636147$   15911   95735734      1       2       84 ONLINE 
  0 SYSTEM                   5029     569906      0       0        0 ONLINE 
 71 _SYSSMU71_1273636147$     476       3098      0       0        0 ONLINE 
 72 _SYSSMU72_1273636147$     473       1110      0       0        0 ONLINE 
 73 _SYSSMU73_1273636147$     475       1634      0       0        0 ONLINE 
  
 121 rows selected.

V$UNDOSTAT

SQL> desc v$undostat
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 BEGIN_TIME                                         DATE
 END_TIME                                           DATE
 UNDOTSN                                            NUMBER
 UNDOBLKS                                           NUMBER
 TXNCOUNT                                           NUMBER
 MAXQUERYLEN                                        NUMBER
 MAXQUERYID                                         VARCHAR2(13)
 MAXCONCURRENCY                                     NUMBER
 UNXPSTEALCNT                                       NUMBER
 UNXPBLKRELCNT                                      NUMBER
 UNXPBLKREUCNT                                      NUMBER
 EXPSTEALCNT                                        NUMBER
 EXPBLKRELCNT                                       NUMBER
 EXPBLKREUCNT                                       NUMBER
 SSOLDERRCNT                                        NUMBER
 NOSPACEERRCNT                                      NUMBER
 ACTIVEBLKS                                         NUMBER
 UNEXPIREDBLKS                                      NUMBER
 EXPIREDBLKS                                        NUMBER
 TUNED_UNDORETENTION                                NUMBER

前面已经说过,动态视图在自动UNDO管理时,同时隐含参数_undo_autotune没有设置为FALSE时比较有用。
现将V$UNDOSTAT中各个字段介绍如下:
基本信息
•	BEGIN_TIME:统计开始时间
•	END_TIME:统计结束时间
使用信息
•	UNDOTSN:最后报告的活动的UNDO表空间的ID。
•	UNDOBLKS:期间产生的UNDO数据块的总数。
•	TXNCOUNT:期间执行事务的总数。
•	MAXQUERYLEN:期间完成的单个查询执行时间最长的长度,单位是秒。此时间计算方法是从游标打开到最后一次执行/提取数据所花费的时间。利用此时间可以调整相应的UNDO RETENTION。不过由于存在游标打开但是中间等待了很长时间没有操作之后再度取数据的情况,因此次数据也不一定准确。
•	MAXQUERYID:上面所说查询的SQL ID。
•	MAXCONCURRENCY:期间并发事务的最大数值。
未过期UNDO数据盗用信息
•	UNXPSTEALCNT:期间发生的未过期UNDO数据盗用的次数。
•	UNXPBLKRELCNT:期间发生的未过期UNDO数据被盗用数据块的数量。
•	UNXPBLKREUCNT:期间发生的未过期UNDO数据盗用后被重用的数据块的数量。
已过期UNDO数据盗用信息
•	EXPSTEALCNT:期间发生的盗用次数。
•	EXPBLKRELCNT:期间发生的被盗用UNDO数据块数量。
•	EXPBLKREUCNT:期间发生的被盗用数据块被重用的数量。

错误发生信息
•	SSOLDERRCNT:期间ORA-1555错误发生次数。
•	NOSPACEERRCNT:期间空间不足错误发生次数。
采样时UNDO数据使用信息
•	ACTIVEBLKS:采样时刻活动的UNDO块数量。
•	UNEXPIREDBLKS:采样时刻未过期的UNDO块数量。
•	EXPIREDBLKS:采样时刻已过期的UNDO块数量。
自动UNDO优化结果
•	TUNED_UNDORETENTION:UNDO表空间中不会被回收的UNDO数据到现在的时间,以秒计。通过查询这个字段我们能知道在之前
某个特定时间完成的事务的UNDO数据是否还存在,对估计Flashback的可用时间很有帮助。
通过查询V$UNDOSTAT的数据可以很容易的得到一段时间整个UNDO表空间使用的情况,对于优化UNDO有着非常重要的作用。

DBA_UNDO_EXTENTS
在字典DBA_UNDO_EXTENTS中,除了那些相关存储的信息之外最需要关心的就是STATUS一列了,这列说明了某个数据区的当前状态,
状态信息包括:
ACTIVE
活动状态。说明当前这个数据区正在为某个正在进行的事务所使用着。
EXPIRED
已过期。这个已分配的数据区已经完成了它的使命,随时可能被分配给其它新的事务使用。
UNEXPIRED
未过期。这个分配的数据区已经不属于任何的活动事务,但是由于UNDO RETENTION设置的需要,一般情况下不会被回收重用。
更详细的信息前面已有介绍。

数据字典的应用
得到活动事务的UNDO使用情况
知道当前时刻谁消耗了多少UNDO空间还是很有用的,比如说跟踪那些UNDO使用量比较大的事务,相关测试如下:

SQL> CREATE TABLE AA AS SELECT * FROM DBA_OBJECTS;

Table created.

SQL> INSERT INTO AA SELECT * FROM DBA_OBJECTS;

50019 rows created.

SQL> DELETE  FROM AA WHERE ROWNUM<11;

10 rows deleted.

SQL>SELECT sess.SID,sess.serial#, sess.osuser, sess.username, 
  rseg.segment_name SEGMENT, rseg.tablespace_name, trans.used_ublk, 
  trans.used_ublk*8 "UNDO SIZE(KB)", rseg.STATUS, sa.sql_text 
  FROM v$session sess, v$transaction trans, dba_rollback_segs rseg, v$sql sa 
  WHERE sess.taddr=trans.addr AND trans.xidusn=rseg.segment_id(+) 
  AND (sess.sql_hash_value=sa.hash_value OR sess.prev_hash_value=sa.hash_value) 
  ORDER BY sql_text;

   SID    SERIAL# OSUSER   USERNAME     SEGMENT         TABLESPACE  USED_UBLK UNDO SIZE(KB) STATUS     SQL_TEXT
------ ---------- -------- ------------ --------------- ---------- ---------- ------------- ---------- ------------------------------
   143       5283 oracle   SYS          _SYSSMU6$       UNDOTBS1           24           192 ONLINE     DELETE  FROM AA WHERE ROWNUM<11
                                                                                                     

   151      27532 oracle   SYS          _SYSSMU10$      UNDOTBS1            1             8 ONLINE     SELECT sess.SID,sess.serial#,
                                                                                                       sess.osuser, sess.username,
                                                                                                       rseg.segment_name SEGMENT, rse
                                                                                                       g.tablespace_name, trans.used_
                                                                                                       ublk,   trans.used_ublk*8 "UND
                                                                                                       O SIZE(KB)", rseg.STATUS, sa.s
                                                                                                       ql_text FROM v$session sess, v
                                                                                                       $transaction trans, dba_rollba
                                                                                                       ck_segs rseg, v$sql sa WHERE s
                                                                                                       ess.taddr=trans.addr AND trans
                                                                                                       .xidusn=rseg.segment_id(+) AND
                                                                                                        (sess.sql_hash_value=sa.hash_
                                                                                                       value OR sess.prev_hash_value=
                                                                                                       sa.hash_value) ORDER BY sql_te
                                                                                                       xt
说明一下这个语句中的SQL_TEXT并不精确,这只是当前的SID所执行的最后一个SQL语句,不一定是会产生UNDO的那个。

查询UNDO表空间的使用情况
    在一个表空间的使用将近100%是一件很让人不爽的事,但是考虑到自动UNDO优化的存在,我们知道UNDO表空间将近100%的使用率
也并不一定就有问题,因此搞清楚UNDO表空间的使用情况是很有必要的,下面语句起的作用就是这个:

SQL> SELECT seg.tablespace_name "Tablespace Name", ts.bytes/1024/1024 "TS Size(MB)", 
  2    ue.status "UNDO Status", count(*) "Used Extents", 
  3    round(sum(ue.bytes)/1024/1024, 2) "Used Size(MB)", 
  4    round(sum(ue.bytes)/ts.bytes*100, 2) "Used Rate(%)"
  5  FROM dba_segments seg, DBA_UNDO_EXTENTS ue, 
  6    (SELECT tablespace_name, sum(bytes) bytes 
  7      FROM dba_data_files GROUP BY tablespace_name) ts 
  8  WHERE ue.segment_NAME=seg.segment_NAME and seg.tablespace_name=ts.tablespace_name 
  9  GROUP BY seg.tablespace_name, ts.bytes, ue.status 
 10  ORDER BY seg.tablespace_name;

Tablespace Name                TS Size(MB) UNDO Stat Used Extents Used Size(MB) Used Rate(%)
------------------------------ ----------- --------- ------------ ------------- ------------
UNDOTBS1                               270 ACTIVE               2          1.06          .39
UNDOTBS1                               270 EXPIRED             26           3.5          1.3
UNDOTBS1                               270 UNEXPIRED            4          8.19         3.03
UNDO_T2                                100 EXPIRED             20          1.25         1.25

从结果undo表空间用unexpired,active,expired的使用比率来判断回滚段是否健康,因此有时undo使用率为100%并不一定代表undo真的有问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: