作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


UNDO_RETENTION的内部实现:

UNDO_RETENTION机制从Oracle 9i开始引入,为了实现这一机制,Oracle在Undo Segment Header上创建了一个Retention Table用于记录相关Undo存储的提交时间,从而实现其保留策略。接下来看一下这个Retention Table的内容,以下测试来自Oracle 11g数据库环境:

sys@TQGZS11G> select banner from x$version where indx=3;
BANNER
------------------------------------------------------------
TNS for Linux: Version 11.1.0.7.0 - Production

首先使用测试用户执行一个DML事务,删除测试表中的部分数据:

sys@TQGZS11G> conn tq/tq
Connected.
tq@TQGZS11G> delete from t where rownum <10;
9 rows deleted.

由于这是一个测试数据库,没有其它事务进行,所以可以通过以下查询找到当前事务使用的回滚段:

sys@TQGZS11G> select a.usn,a.xacts,b.name from v$rollstat a,v$rollname b
  2  where a.usn=b.usn and a.xacts >0;
       USN      XACTS NAME
---------- ---------- --------------------------------------------------
         5          1 _SYSSMU5_1186132793$

使用如下命令将UNDO HEADER转储出来:

sys@TQGZS11G> alter system dump undo header '_SYSSMU5_1186132793$';
System altered.

然后提交这个事务:

tq@TQGZS11G> commit;
Commit complete.

接下来再启动一个新的会话连接,再次执行一次回滚段头的转储输出:

[oracle@rhel52: ~]$sqlplus / as sysdba
sys@TQGZS11G> alter system dump undo header '_SYSSMU5_1186132793$';
System altered.

找到两次转储生成的跟踪文件:

[oracle@rhel52: ~/diag/rdbms/tqgzs11g/tqgzs11g/trace]$ll -th | head -5
total 13M
-rw------- 1 oracle oinstall  19K Dec 24 04:43 tqgzs11g_ora_2308.trc
-rw------- 1 oracle oinstall   74 Dec 24 04:43 tqgzs11g_ora_2308.trm
-rw------- 1 oracle oinstall  19K Dec 24 04:41 tqgzs11g_ora_2238.trc
-rw------- 1 oracle oinstall   74 Dec 24 04:41 tqgzs11g_ora_2238.trm

先进行简单的diff差异比较,以下摘录出来的信息就是来自保留表中的数据:

[oracle@rhel52: ~/diag/rdbms/tqgzs11g/tqgzs11g/trace]$diff tqgzs11g_ora_2238.trc tqgzs11g_ora_2308.trc
346c346,347
<  Extent Number:1  Commit Time: 1261622080
---
>  Extent Number:1  Commit Time: 1261622215
>  Extent Number:2  Commit Time: 0

注意提交后,回滚段区间(Extent)的提交时间发生改变,后者的时间正是刚才的提交时间:

[oracle@rhel52: ~/diag/rdbms/tqgzs11g/tqgzs11g/trace]$date -d '1970-01-01 00:00:00 UTC 1261622215 seconds' +"%Y-%m-%d %T %z"
2009-12-24 10:36:55 +0800
[oracle@rhel52: ~/diag/rdbms/tqgzs11g/tqgzs11g/trace]$date
Thu Dec 24 10:38:36 CST 2009

最后从转储文件中摘录一个更为完整的保留表信息供参考(提交后的信息输出):

Retention Table
  -----------------------------------------------------------
Extent Number:0  Commit Time: 1261622080
Extent Number:1  Commit Time: 1261622215
Extent Number:2  Commit Time: 0

- The End -