技术开发 频道

Oracle 11g新特性之事务管理

这会将表置于闪回数据存档模式。现在,该表中的所有行更改都将受到永久跟踪。我们来看一个演示。

首先,选择该表的一个具体行。


SQL> select txn_amt from trans where trans_id = 2; TXN_AMT
TXN_AMT ---------- 19325.67 SQL> update trans set txn_amt = 2000 where trans_id = 2; 1 row updated. SQL> commit; Commit complete.

现在,如果您选择了该行,则这一列将始终显示 2000。要查找早先某一时间点时的值,您可以使用闪回查询,如下所示:


elect txn_amt from trans
from trans as of timestamp to_timestamp ('07/18/2007 12:39:00','mm/dd/yyyy hh24:mi:ss') where trans_id = 2; TXN_AMT ---------- 19325.67

现在,隔一段时间,当还原数据从还原段中清除后,再次查询这个闪回数据:


select txn_amt from trans
from trans as of timestamp to_timestamp ('07/18/2007 12:39:00','mm/dd/yyyy hh24:mi:ss') where trans_id = 2;

结果返回:19325.67. 还原数据已经清除了,那么这个数据来自何处呢?

我们问问 Oracle。您可以使用自动跟踪来查看执行计划:



SQL> set autotrace traceonly explain SQL
SQL> select txn_amt 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
相关文章