【DB笔试面试810】在Oracle中,什么是闪回版本查询(Flashback Version Query)?

2020-06-04 10:37:45 浏览数 (1)

题目部分

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

答案部分

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

查询语句一般为:

代码语言:javascript复制
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
  FROM T_FVQ_20170617_LHR VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 
 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语句(这些语句会更改相应表的结构)。

闪回版本查询示例:

代码语言:javascript复制
LHR@orclasm > SHOW PARAMETER UNDO

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_undo_autotune                       boolean     FALSE
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1

LHR@orclasm > CREATE TABLE T_FVQ_20170617_LHR AS SELECT * FROM SCOTT.EMP WHERE 1=2;--创建表T_FVQ_20170617_LHR

Table created.

LHR@orclasm > SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询时间作为TIMESTAMP开始时间

TO_DATE(SYSDATE,'YY TIMESTAMP_TO_SCN(SYSDATE)
------------------- -------------------------
2017-06-17 14:49:58                  67842991

LHR@orclasm >  INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7902;--插入EMPNO=7902

1 row created.

LHR@orclasm > COMMIT;  --插入一行提交作为一个版本

Commit complete.

LHR@orclasm > INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7788;

1 row created.

LHR@orclasm > INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7698;

1 row created.

LHR@orclasm > COMMIT; --插入两行提交作为一个版本

Commit complete.

LHR@orclasm > UPDATE T_FVQ_20170617_LHR SET SAL=8888 WHERE EMPNO=7788;

1 row updated.

LHR@orclasm > COMMIT; --再次更改EMPNO=7788的行提交,使这行有旧版本

Commit complete.

LHR@orclasm > SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询时间作为TIMESTAMP结束时间

TO_DATE(SYSDATE,'YY TIMESTAMP_TO_SCN(SYSDATE)
------------------- -------------------------
2017-06-17 14:51:46                  67843218

LHR@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
  2    FROM T_FVQ_20170617_LHR VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 
  3   ORDER BY VERSIONS_STARTTIME;

VERSIONS_STARTTIME  VERSIONS_STARTSCN VERSIONS_ENDTIME    VERSIONS_ENDSCN VERSIONS_XID     V      EMPNO
------------------- ----------------- ------------------- --------------- ---------------- - ----------
2017-06-17 14:50:04          67843038                                     050007009F9F0000 I       7902
2017-06-17 14:50:57          67843139                                     07000D0018830000 I       7698
2017-06-17 14:50:57          67843139 2017-06-17 14:51:34        67843209 07000D0018830000 I       7788
2017-06-17 14:51:34          67843209                                     07001F0019830000 U       7788

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

0 人点赞