flashback_transaction_query数据保留的时间

flashback_transaction_query里面的数据很庞大,数据的来源和数据保留的时间曾经困扰过我,简单的测试了一下...[@more@]

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值