♣题目 部分

在Oracle中,什么是闪回版本查询(Flashback Version Query)?

 

     ♣答案部分

 

闪回版本查询(Flashback Version Query)是查询过去某个时间段或某个SCN段内表中数据的变化情况。闪回版本查询基于回滚(Undo)表空间中的回滚信息实现。

 

查询语句一般为:

1SELECT TO_CHAR(VERSIONS_STARTTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_STARTTIME,VERSIONS_STARTSCN,TO_CHAR(VERSIONS_ENDTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_ENDTIME ,VERSIONS_ENDSCN,VERSIONS_XID,VERSIONS_OPERATION,EMPNO
2  FROM T_FVQ_20170617_LHR VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 
3 ORDER BY VERSIONS_STARTTIME;

 

其中,VERSIONS BETWEEN用于指定闪回版本查询时查询的时间段或SCN段;AS OF用于指定闪回查询时查询的时间点或SCN。在闪回版本查询的目标列中,可以使用下列几个伪列返回版本信息:

l VERSIONS_STARTTIME:基于时间的版本有效范围的下界;

l VERSIONS_STARTSCN:基于SCN的版本有效范围的下界;

l VERSIONS_ENDTIME:基于时间的版本有效范围的上界;

l VERSIONS_ENDSCN:基于SCN的版本有效范围的上界;

l VERSIONS_XID:操作的事务ID,唯一的标识行;

l VERSIONS_OPERATION:执行操作的类型,I 表示INSERT,D 表示DELETE,U 表示UPDATE。

闪回版本查询注意事项:

① VERSIONS子句不能用于查询的表包括外部表、临时表和固定表。

② 不能使用VERSIONS子句查询视图。但是,在视图定义中可使用VERSIONS子句。

③ SELECT语句中的VERSIONS子句不能跨多个DDL语句(这些语句会更改相应表的结构)。

闪回版本查询示例:

 1LHR@orclasm > SHOW PARAMETER UNDO
 2
 3NAME                                 TYPE        VALUE
 4------------------------------------ ----------- ------------------------------
 5_undo_autotune                       boolean     FALSE
 6undo_management                      string      AUTO
 7undo_retention                       integer     900
 8undo_tablespace                      string      UNDOTBS1
 9
10LHR@orclasm > CREATE TABLE T_FVQ_20170617_LHR AS SELECT * FROM SCOTT.EMP WHERE 1=2;--创建表T_FVQ_20170617_LHR
11
12Table created.
13
14LHR@orclasm > SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询时间作为TIMESTAMP开始时间
15
16TO_DATE(SYSDATE,'YY TIMESTAMP_TO_SCN(SYSDATE)
17------------------- -------------------------
182017-06-17 14:49:58                  67842991
19
20LHR@orclasm >  INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7902;--插入EMPNO=7902
21
221 row created.
23
24LHR@orclasm > COMMIT;  --插入一行提交作为一个版本
25
26Commit complete.
27
28LHR@orclasm > INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7788;
29
301 row created.
31
32LHR@orclasm > INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7698;
33
341 row created.
35
36LHR@orclasm > COMMIT; --插入两行提交作为一个版本
37
38Commit complete.
39
40LHR@orclasm > UPDATE T_FVQ_20170617_LHR SET SAL=8888 WHERE EMPNO=7788;
41
421 row updated.
43
44LHR@orclasm > COMMIT; --再次更改EMPNO=7788的行提交,使这行有旧版本
45
46Commit complete.
47
48LHR@orclasm > SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询时间作为TIMESTAMP结束时间
49
50TO_DATE(SYSDATE,'YY TIMESTAMP_TO_SCN(SYSDATE)
51------------------- -------------------------
522017-06-17 14:51:46                  67843218
53
54LHR@orclasm > SELECT TO_CHAR(VERSIONS_STARTTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_STARTTIME,VERSIONS_STARTSCN,TO_CHAR(VERSIONS_ENDTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_ENDTIME ,VERSIONS_ENDSCN,VERSIONS_XID,VERSIONS_OPERATION,EMPNO
55  2    FROM T_FVQ_20170617_LHR VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 
56  3   ORDER BY VERSIONS_STARTTIME;
57
58VERSIONS_STARTTIME  VERSIONS_STARTSCN VERSIONS_ENDTIME    VERSIONS_ENDSCN VERSIONS_XID     V      EMPNO
59------------------- ----------------- ------------------- --------------- ---------------- - ----------
602017-06-17 14:50:04          67843038                                     050007009F9F0000 I       7902
612017-06-17 14:50:57          67843139                                     07000D0018830000 I       7698
622017-06-17 14:50:57          67843139 2017-06-17 14:51:34        67843209 07000D0018830000 I       7788
632017-06-17 14:51:34          67843209                                     07001F0019830000 U       7788