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 -