1. 启用闪回查询

当系统 INI 参数 ENABLE_FLASHBACK 置为 1 时,闪回功能开启,可以进行闪回查询。MPP 环境不支持闪回查询。

SQL> select name,type,value from v$parameter where name='ENABLE_FLASHBACK';
行号     name             TYPE VALUE
---------- ---------------- ---- -----
1          ENABLE_FLASHBACK SYS  0
 
已用时间: 40.139(毫秒). 执行号:4.
 
 
改参数是SYS级别的,修改后立即生效:
SQL> alter system set 'ENABLE_FLASHBACK'=1 both;
DMSQL 过程已成功完成
已用时间: 15.364(毫秒). 执行号:5.
 
SQL> select name,type,value from v$parameter where name='ENABLE_FLASHBACK';
行号     name             TYPE VALUE
---------- ---------------- ---- -----
1          ENABLE_FLASHBACK SYS  1
已用时间: 4.721(毫秒). 执行号:6.

注意:

修改参数后,之前没有重启,测试的时候一直报:flashback version has been out of date.的错误,但根据参数的类型,报错查询,是系统级别修改后立即生效的。 后来重启数据库之后,该错误消失:

SQL> select from anqing when timestamp ‘2018-08-31 23:09:20’;
select from anqing when timestamp ‘2018-08-31 23:09:20’;
[-9801]:flashback version has been out of date.

2. 闪回查询子句

用户通过闪回查询子句,可以得到指定表过去某时刻的结果集。闪回查询只支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图。

 

语法格式:
<闪回查询子句>::=WHEN |
参数
1.time_exp 一个日期表达式,一般用字符串方式表示
2.trxid 指定事务 ID 号
 
 
#通过时间:
SQL> create table test(id int);
操作已执行
已用时间: 20.815(毫秒). 执行号:7.
 
SQL> insert into test values(1);
影响行数 1
已用时间: 0.706(毫秒). 执行号:8.
 
SQL> commit;
操作已执行
已用时间: 0.988(毫秒). 执行号:9.
 
SQL> select sysdate();
 
行号     sysdate()                                                                                           
---------- ----------------------------------------------
1          2020-08-25 21:15:06
 
已用时间: 0.756(毫秒). 执行号:10.
 
SQL> insert into test values(2);
影响行数 1
已用时间: 0.381(毫秒). 执行号:11.
 
SQL> commit;

操作已执行

已用时间: 0.665(毫秒). 执行号:12.

#指定时间后只能看到一条数据:
SQL> select * from test when timestamp '2020-08-25 21:15:06';
LINEID     ID         
---------- -----------
1          1

指定 TRXID 闪回查询:注意这里只针对update 有效,如果是insert,则没有效果:

 

#根据 TRXID 确定版本。
SQL> update test set id=3 where id=2;
影响行数 1
已用时间: 1.034(毫秒). 执行号:18.
 
SQL> commit;
操作已执行
已用时间: 0.680(毫秒). 执行号:19.
 
#查看VERSIONS_ENDTRXID,如果是insert,这里VERSIONS_ENDTRXID则为NULL:
SQL> select versions_endtrxid, id from test versions between timestamp '2020-08-25 21:15:06' and sysdate;
行号     VERSIONS_ENDTRXID    id         
---------- -------------------- -----------
1          NULL                 1
2          NULL                 3
3          8024                 2
 
已用时间: 0.381(毫秒). 执行号:20.
 
SQL> SELECT * FROM test WHEN TRXID 8024;
行号     id         
---------- -----------
1          1
2          2
 
已用时间: 0.664(毫秒). 执行号:21.
SQL>

3. 闪回版本查询

用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录。指定条件可以为时刻,或事务号。

闪回版本查询支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图。

 

语法格式

<闪回版本查询子句>::=VERSIONS BETWEEN |

参数

1.time_exp 日期表达式,一般用字符串方式表示。time_exp1 表示起始时间,time_exp2 表示结束时间

trxid 指定事务 ID 号,整数表示。trxid1 表示起始 trxid,trxid2 表 示结束 trxid

 

SQL> update test set id=100 where id=1;

影响行数 1

已用时间: 1.010(毫秒). 执行号:22.

 

SQL> commit;

操作已执行

已用时间: 0.869(毫秒). 执行号:23.

 

SQL> select versions_endtrxid, id from test versions between timestamp '2020-08-25 21:15:06' and sysdate;
行号     VERSIONS_ENDTRXID    id         
---------- -------------------- -----------
1          NULL                 100
2          NULL                 3
3          8025                 1

 

已用时间: 0.449(毫秒). 执行号:24.

 

4. 闪回事务查询

闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。

 

SQL> select * from v$flashback_trx_info where commit_timestamp > '2020-08-25 21:15:06';