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';