Oracle 11g新特性之事务管理
这会将表置于闪回数据存档模式。现在,该表中的所有行更改都将受到永久跟踪。我们来看一个演示。
首先,选择该表的一个具体行。
TXN_AMT ----------SQL> select txn_amt from trans where trans_id = 2;
![]()
TXN_AMT
19325.67
![]()
SQL> update trans set txn_amt = 2000 where trans_id = 2;
![]()
1 row updated.
![]()
SQL> commit;
![]()
Commit complete.
![]()
现在,如果您选择了该行,则这一列将始终显示 2000。要查找早先某一时间点时的值,您可以使用闪回查询,如下所示:
from trans as of timestamp to_timestamp ('07/18/2007 12:39:00','mm/dd/yyyy hh24:mi:ss')elect txn_amt
from trans
where trans_id = 2;
![]()
TXN_AMT
----------
19325.67
![]()
现在,隔一段时间,当还原数据从还原段中清除后,再次查询这个闪回数据:
from trans as of timestamp to_timestamp ('07/18/2007 12:39:00','mm/dd/yyyy hh24:mi:ss')select txn_amt
from trans
where trans_id = 2;
![]()
结果返回:19325.67. 还原数据已经清除了,那么这个数据来自何处呢?
我们问问 Oracle。您可以使用自动跟踪来查看执行计划:
SQL> select txn_amtSQL> set autotrace traceonly explain
SQL
2 from trans
3 as of timestamp to_timestamp ('07/18/2007 12:39:00','mm/dd/yyyy hh24:mi:ss')
4 where trans_id = 2;
![]()
Execution Plan
----------------------------------------------------------
Plan hash value: 535458644
![]()
----------------------------------------------------------
![]()
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 52 | 10 (10)| 00:00:01 |
| 1 | VIEW | | 2 | 52 | 10 (10)| 00:00:01 |
| 2 | UNION-ALL | | | | | | |* 3 | FILTER | | | | | |
| 4 | PARTITION RANGE SINGLE| | 1 | 52 | 3 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | SYS_FBA_HIST_68909 | 1 | 52 | 3 (0)| 00:00:01 |
|* 6 | FILTER | | | | | |
|* 7 | HASH JOIN OUTER | | 1 | 4053 | 10 (10)| 00:00:01 |
|* 8 | TABLE ACCESS FULL | TRANS | 1 | 38 | 6 (0)| 00:00:01 |
| 9 | VIEW | | 2 | 8030 | 3 (0)| 00:00:01 |
|* 10 | TABLE ACCESS FULL | SYS_FBA_TCRV_68909 | 2 | 8056 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
![]()
Predicate Information (identified by operation id):
---------------------------------------------------
![]()
3 - filter(NULL IS NOT NULL)
5 - filter("TRANS_ID"=2 AND "ENDSCN">161508784336056 AND "ENDSCN"<=1073451 AND ("STARTSCN" IS NULL
OR "STARTSCN"<=161508784336056))
6 - filter("F"."STARTSCN"<=161508784336056 OR "F"."STARTSCN" IS NULL)
7 - access("T".ROWID=("F"."RID"(+)))
8 - filter("T"."VERSIONS_STARTSCN" IS NULL AND "T"."TRANS_ID"=2)
10 - filter(("ENDSCN" IS NULL OR "ENDSCN">1073451) AND ("STARTSCN" IS NULL OR "STARTSCN"<1073451))
![]()
Note
-----
- dynamic sampling used for this statement
![]()
该输出回答了我们的疑问“这个数据来自何处?”,数据来自表 SYS_FBA_HIST_68909,这是您先前为那个表定义的闪回存档中的某个位置。您可以查看这个表,但是 Oracle 不支持在那里直接查看数据。不过,我觉得您也没有必要那样做。
存档中的数据能保留多长时间呢?这就是保留期限的作用了。数据可以在该期限内一直保留。保留期限过后,当有新的数据进来时,较老的数据将被清除。您也可以自己清除数据,例如:
alter flashback archive near_term purge before scn 1234567;
0
相关文章
