首页 > Basics, Oracle > UNDO管理之二:UNDO相关数据字典
10/05 19

UNDO管理之二:UNDO相关数据字典




topUNDO相关数据字典


topUNDO相关数据字典概览

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

与UNDO相关的数据字典可以分成下面几类:

  1. 与UNDO管理直接相关的数据字典
    • 9i之前手工管理时就存在的数据字典
      • V$ROLLNAME:回滚段名称和回滚段ID对应表。
      • V$ROLLSTAT:在使用AUM时,该视图保存着所有UNDO表空间中每一个已分配的回滚段当前状态以及相关的统计信息,不显示状态在OFFLINE的回滚段。
      • DBA_ROLLBACK_SEGS:此字典显示所有回滚段的当前状态以及与存储空间分配相关的信息。
    • 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管理间接相关的数据字典
    • 事务相关
      • V$TRANSACTION:当前正在进行事务的信息,与UNDO管理相关的是当前事务所涉及的UNDO段,UNDO空间占用等等信息。具体的前面已经有介绍。
    • 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使用情况的统计,属于纵向的


topV$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表空间无法扩展时出现。

下面的例子中回滚段91中存在一个未完成的事务。

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.


topV$UNDOSTAT

前面已经说过,动态视图在自动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有着非常重要的作用。


topDBA_UNDO_EXTENTS

在字典DBA_UNDO_EXTENTS中,除了那些相关存储的信息之外最需要关心的就是STATUS一列了,这列说明了某个数据区的当前状态,状态信息包括:

ACTIVE
活动状态。说明当前这个数据区正在为某个正在进行的事务所使用着。
EXPIRED
已过期。这个已分配的数据区已经完成了它的使命,随时可能被分配给其它新的事务使用。
UNEXPIRED
未过期。这个分配的数据区已经不属于任何的活动事务,但是由于UNDO RETENTION设置的需要,一般情况下不会被回收重用。

更详细的信息前面已有介绍。


top数据字典的应用


top得到活动事务的UNDO使用情况

知道当前时刻谁消耗了多少UNDO空间还是很有用的,比如说跟踪那些UNDO使用量比较大的事务,相关查询如下:

col sid for 99999
col osuser for a8
col username for a12
col tablespace_name for a10
col segment for a15
col sql_text for a30
col status for a10
set lines 150 pages 999
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   USERN SEGMENT                   TABLESPACE_NAME  USED_UBLK
---------- ---------- -------- ----- ------------------------- --------------- ----------
UNDO SIZE(KB) STATUS           SQL_TEXT
------------- ---------------- ------------------------------
       526          9 oracle   ORAINST _SYSSMU154_1273636148$    UNDO_T2               4861
        38888 ONLINE           update tt set b='aaa'

说明一下这个语句中的SQL_TEXT并不精确,这只是当前的SID所执行的最后一个SQL语句,不一定是会产生UNDO的那个。


top查询UNDO表空间的使用情况

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

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

语句执行结果如下所示:

Tablespace Name  TS Size(MB) UNDO Stat Used Extents Used Size(MB) Used Rate(%)
---------------- ----------- --------- ------------ ------------- ------------
UNDO_T1                  100 EXPIRED            174         45.56        45.56
UNDO_T1                  100 UNEXPIRED          120          8.44         8.44
UNDO_T2                  513 ACTIVE              55         38.13         7.43
UNDO_T2                  513 EXPIRED            127          7.94         1.55
UNDO_T2                  513 UNEXPIRED          672        465.56        90.75

从结果可以看到尽管表空间UNDO_T2使用总数已达到99%,但是其中UNEXPIRED的就占了90%,ACTIVE占用也就是不到8%,因此此时的UNDO表空间是安全的,完全没有问题。


top延伸阅读

  1. invin
    2010年8月26日16:26 | #1

    一定得留个言谢谢下

  2. 2010年9月19日09:51 | #2

    数据字典是什么,太专业了,支持下吧

  3. 2010年10月21日15:02 | #3

    UNEXPIRED的就占了90% 应该不算安全了吧 如果是EXPIRED占了90% 才算安全吧

  1. 2010年5月19日10:55 | #1

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

无觅相关文章插件,快速提升流量