Oracle数据库的闪回版本查询(Flashback Version Query)提供了一个审计行改变的查询功能,通过它可以查找到所有已经提交了的行记录。视频讲解如下:
https://www.bilibili.com/video/BV1RXDUYbE3E/?aid=113441478087...
一、 闪回版本查询简介
使用闪回版本查询可以获取在给定的时间区间中,指定的行的不同版本。当commit语句被执行时,一个新的行版本将被创建。闪回版本查询使用了select语句的versions between子句来指定时间区间。闪回版本查询的语法格式如下所示:
select 列1,列2,.....
from 表名
versions between [scn|timestamp] [表达式|minvalue]
and [表达式|maxvalue] as of [scn|timestamp] 表达式;
# 其中:
# between...and:用于指定时间区间。
# scn|timestamp:用于指定使用SCN,还是使用时间戳。
# as of:用于恢复单个版本的数据。
# minvalue:代表SCN或者时间戳的最小值。
# maxvalue:代表SCN或者时间戳的最大值。
二、 【实战】在查询中使用闪回版本查询
在了解到了什么是Oracle数据库的闪回版本查询后,下面将通过一个具体是示例来演示如何在查询中使用闪回版本查询。
(1)使用c##scott用户登录数据库
sqlplus c##scott/tiger
(2)创建一张表用于测试闪回版本查询,并往表中插入数据。
SQL> create table flashback2(tid number,tname varchar2(20));
SQL> insert into flashback2 values(1,'Tom');
SQL> commit;
SQL> insert into flashback2 values(2,'Mary');
SQL> commit;
SQL> insert into flashback2 values(3,'Mike');
SQL> commit;
SQL> update flashback2 set tname='Mary123' where tid=2;
SQL> commit;
# 由于这里执行了四次commit语句,
# 因此在表flashback2上产生四个版本的信息。
(3)执行一个简单的查询语句。
SQL> select * from flashback2;
# 输出的信息如下:
TID TNAME
-------------- --------------------
1 Tom
2 Mary123
3 Mike
# 由于这里的查询没有指定具体的版本信息,
# 因此在默认情况下将查询表的最新版本数据。
(4)执行闪回版本查询获取表上所有的历史版本信息。
SQL> select * from flashback2
versions between scn minvalue and maxvalue;
# 输出的信息如下:
TID TNAME
------------- --------------------
2 Mary123
3 Mike
2 Mary
1 Tom
# 通过指定关键字versions表明将执行闪回版本查询,
# scn minvalue and maxvalue用于指定查询版本的区间范围。
# 这里的范围是从最小的SCN号查询到最大的SCN号,
# 即:查询表上面的所有版本,这里一共返回了4个版本。
(5)使用闪回版本查询的伪列获取每个版本的详细信息。
SQL> select tid,tname,
versions_starttime,versions_endtime,versions_operation
from flashback2
versions between scn minvalue and maxvalue
order by 1,3;
# 输出的信息如下:
TID TNAME VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_OPERATION
----- ---------- ------------------------- ----------------------- ------------------
1 Tom I
2 Mary 25-MAR-25 11.00.23 AM 25-MAR-25 11.00.38 AM I
2 Mary123 25-MAR-25 11.00.38 AM U
3 Mike 25-MAR-25 11.00.32 AM I
# 其中的伪列:
# VERSIONS_STARTTIME:代表当前版本的起始时间。
# VERSIONS_ENDTIME:代表当前版本的结束时间。
# VERSIONS_OPERATION:代表当前版本执行的具体操作。
# 由于在第(2)步操作中执行了一条update语句将Mary改了Mary123,
# 因此可以看出Mary的生命周期是
# 从25-MAR-25 11.00.23 AM到25-MAR-25 11.00.38 AM。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。