session 1:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> alter system set undo_retention=10;
系统已更改。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10
undo_tablespace string UNDOTBS1
SQL> set time on
09:19:13 SQL> desc t
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(10)
09:19:16 SQL> truncate table t;
表被截断。
09:19:24 SQL> insert into t values(1,'a');
已创建 1 行。
09:19:32 SQL> commit;
提交完成。
09:19:36 SQL> insert into t values(2,'a');
已创建 1 行。
09:19:50 SQL> select xid from v$transaction;
XID
----------------
02000C0016030000
09:20:20 SQL> select count(*) from flashback_transaction_query where xid='02000C0016030000' and operation='INSERT';
COUNT(*)
----------
1
09:22:03 SQL> commit;
提交完成。
09:22:09 SQL> select * from t;
ID NAME
---------- ----------
1 a
2 a
--很显然flashback_transaction_query中的数据和undo_retention没有关系,10秒钟早已过去...但是事务对应的数据在
flashback_transaction_query中依然可以查询到
09:24:09 SQL> select count(*) from flashback_transaction_query where xid='02000C0016030000' and operation='INSERT';
COUNT(*)
----------
1
09:24:37 SQL> select count(*) from flashback_transaction_query where xid='02000C
0016030000'
09:39:29 2 and operation='INSERT';
COUNT(*)
----------
1
09:39:35 SQL> create undo tablespace undotbs2 datafile 'E:ORACLEPRODUCT10.2.0
ORADATAORCLundotbs02.dbf' size 1m;
表空间已创建。
09:41:51 SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10
undo_tablespace string UNDOTBS1
09:41:56 SQL> alter system set undo_tablespace='undotbs2';
系统已更改。
09:42:12 SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10
undo_tablespace string undotbs2
--当前实例的undo被切换之后flashback_transaction_query中的数据依然存在,当我们把undotbs1表空间删除之后并且重启实例可以观察到
flashback_transaction_query里面的数据不存在了,这个大家可以验证
09:42:16 SQL> select count(*) from flashback_transaction_query where xid='02000C0016030000' and operation='INSERT';
COUNT(*)
----------
1
SQL> select sid from v$mystat where rownum=1;
SID
----------
142
SQL> select sid,serial#,paddr from v$session where sid=142;
SID SERIAL# PADDR
---------- ---------- --------
142 1591 6D24E99C
SQL> declare
2 i number :=0;
3 begin
4 loop
5 update t set id=i , name='c' ;
6 i := i+1;
7 if mod(i,100)=0 then
8 commit;
9 end if ;
10 end loop;
11 end;
12 /
--=============================
session 2:(用来监控)
10:01:42 SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10
undo_tablespace string undotbs2
10:01:51 SQL> select *from t;
ID NAME
---------- ----------
3 c
3 c
10:10:45 SQL> variable i refcursor;
10:11:01 SQL> exec open :i for select * from t;
PL/SQL 过程已成功完成。
--监视事务寻找其中的一个xid验证事务对应的数据在flashback_transaction_query中是否存在
10:11:11 SQL> select xid from v$transaction;
未选定行
10:11:55 SQL> select count(*) from flashback_transaction_query where xid in (sel
ect xid from v$transaction) and operation='UPDATE';
COUNT(*)
----------
0
10:12:55 SQL> select xid from v$transaction;
未选定行
10:13:48 SQL> select xid from v$transaction;
XID
----------------
0D002F0088000000
0B00140085000000
10:13:49 SQL> select xid from v$transaction;
XID
----------------
1000030086000000
--以事务id:1000030086000000为例查询验证flashback_transaction_query里面的数据,发现flashback_transaction_query
里面没有了刚才事务id:1000030086000000所对应的数据,原因当然是undo中的before image被覆盖了
10:13:55 SQL> select count(*) from flashback_transaction_query where xid='100003
0086000000' and operation='UPDATE';
COUNT(*)
----------
0
--下面输出也显示了undo中的before image不存在了,导致不能使下面的查询实现一致性读取数据:
10:14:40 SQL> print i;
ERROR:
ORA-01555: 快照过旧: 回退段号 14 (名称为 "_SYSSMU14$") 过小
未选定行
10:14:47 SQL> alter system kill session '142,1591';
系统已更改。
10:15:15 SQL> select * from t;
ID NAME
---------- ----------
163299 c
163299 c
10:16:20 SQL>
--结论:flashback_transaction_query中的数据来自undo datafile,只要事务对应的
before image在undo datafile中存在,flashback_transaction_query里面就可以查询到数据...
目前没发现受那个参数的制约
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19602/viewspace-1030364/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/19602/viewspace-1030364/