当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。闪回技术主要是通过回滚段存储的UNDO记录来完成历史记录的还原。设置ENABLE_FLASHBACK为1后,开启闪回功能。DM会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由UNDO_RETENTION参数指定。
使用说明:
1. 闪回查询只支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、列存储表、外部表与视图;
2. 闪回查询中lsn的值,可以通过查询动态视图V$RLOG或V$LSN_TIME来确定,也可以通过闪回版本查询(见下节)的伪列来确定;
3. 由于视图V$LSN_TIME每三秒收集一次LSN/TIME映射关系,因此基于时间进行闪回查询时可能存在三秒的误差,如果需要进行精确度更高的闪回查询,建议基于LSN进行闪回查询。
1、闪回开启。
ENABLE_FLASHBACK和UNDO_RETENTION两参数与闪回相关,ENABLE_FLASHBACK=1,闪回开启;ENABLE_FLASHBACK=0闪回关闭。UNDO_RETENTION,事物提交后数据在回滚段保存的最大时间。
闪回是否开启:
SQL> select * from v$parameter where name like '%ENABLE_FLASHBACK%';
开启闪回:
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);
或
SQL> alter system set 'enable_flashback'=1 both;
关闭闪回:
SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 0);
或
SQL> alter system set 'enable_flashback'=0 both;
查询当前UNDO_RETENTION值:
SQL> select * from v$parameter where name like '%UNDO_RETENTION%';
设置UNDO_RETENTION数值:
SQL> SP_SET_PARA_DOUBLE_VALUE(1, 'UNDO_RETENTION', 1200);
或
ALTER SYSTEM SET 'undo_retention'=1200 BOTH;
2、闪回查询。
闪回查询开启后,可以按时间查询历史记录。
通过指定一个时间(timestamp类型),通常可以用一个日期时间字符串表达。
2.1 准备测试数据:
SQL> INSERT INTO TB_SHH VALUES(1,'WUHAN');
affect rows 1
SQL> SELECT * FROM TB_SHH;
LINEID ID CITY
---------- ----------- -----
1 1 WUHAN
used time: 9.344(ms). Execute id is 541.
SQL> SELECT SYSDATE FROM DUAL;
LINEID SYSDATE
---------- -------------------
1 2022-05-19 20:48:57
used time: 7.899(ms). Execute id is 542.
2022-05-19 20:48:57
此时时间为:2022-05-19 20:48:57
2.2 向表中再插入一条数据:
SQL> INSERT INTO TB_SHH VALUES(2,'SHANGHAI');
affect rows 1
used time: 8.410(ms). Execute id is 543.
SQL> COMMIT;
executed successfully
used time: 31.193(ms). Execute id is 544.
SQL> SELECT * FROM TB_SHH;
LINEID ID CITY
---------- ----------- --------
1 1 WUHAN
2 2 SHANGHAI
used time: 5.510(ms). Execute id is 546.
此时表中2条数据。
2.3 闪回测试,查询历史时刻“2022-05-19 20:48:57”的数据:
SQL> SELECT * FROM TB_SHH WHEN TIMESTAMP '2022-05-19 20:48:57';
LINEID ID CITY
---------- ----------- -----
1 1 WUHAN
used time: 23.851(ms). Execute id is 547.
2.4 距离插入第一行操作时间间隔24分钟后再查询。
SQL> SELECT SYSDATE FROM DUAL;
LINEID SYSDATE
---------- -------------------
1 2022-05-19 21:12:43
used time: 2.044(ms). Execute id is 549.
SQL> SELECT * FROM TB_SHH WHEN TIMESTAMP '2022-05-19 20:48:57';
LINEID ID CITY
---------- ----------- --------
1 1 WUHAN
2 2 SHANGHAI
used time: 0.834(ms). Execute id is 550.
发现与上次闪回查询的结果不一样。为什么?因为第二次闪回查询的时间距离第一次插入数据时刻相距24分钟,大于UNDO_RETENTION设置1200秒。
3、闪回版本。
准备测试数据:
SQL> CREATE TABLE TB_SHAHHUI (ID INT, CITY VARCHAR2(50));
executed successfully
used time: 41.658(ms). Execute id is 719.
SQL> INSERT INTO TB_SHAHHUI VALUES(1,'WUHAN');
affect rows 1
used time: 8.100(ms). Execute id is 720.
SQL> COMMIT;
executed successfully
used time: 17.528(ms). Execute id is 721.
SQL> SELECT * FROM TB_SHAHHUI;
LINEID ID CITY
---------- ----------- -----
1 1 WUHAN
used time: 2.004(ms). Execute id is 722.
记录时间:
SQL> SELECT SYSDATE FROM DUAL;
LINEID SYSDATE
---------- -------------------
1 2022-05-19 22:46:45
SQL> select versions_endtrxid, id,CITY from TB_SHAHHUI versions between timestamp '2022-05-19 22:46:45' and sysdate;
LINEID VERSIONS_ENDTRXID ID CITY
---------- -------------------- ----------- -----
1 NULL 1 WUHAN
used time: 9.555(ms). Execute id is 727.
目前还只有当前版本,没有闪回版本。NULL表示当前版本。
第1次更新数据:
SQL> update TB_SHAHHUI set CITY='SHENZHEN' WHERE ID='1';
affect rows 1
used time: 9.556(ms). Execute id is 729.
SQL> commit;
executed successfully
used time: 22.508(ms). Execute id is 730.
SQL> select versions_endtrxid, id,CITY from TB_SHAHHUI versions between timestamp '2022-05-19 22:46:45' and sysdate;
LINEID VERSIONS_ENDTRXID ID CITY
---------- -------------------- ----------- --------
1 NULL 1 SHENZHEN
2 7043 1 WUHAN
used time: 2.035(ms). Execute id is 731.
此时产生了1个闪回版本。
第2次更新数据:
SQL> update TB_SHAHHUI set CITY='SHANGHAI' WHERE ID='1';
affect rows 1
used time: 2.995(ms). Execute id is 732.
SQL> commit;
executed successfully
used time: 6.907(ms). Execute id is 733.
SQL> select versions_endtrxid, id,CITY from TB_SHAHHUI versions between timestamp '2022-05-19 22:46:45' and sysdate;
LINEID VERSIONS_ENDTRXID ID CITY
---------- -------------------- ----------- --------
1 NULL 1 SHANGHAI
2 7044 1 SHENZHEN
3 7043 1 WUHAN
used time: 1.137(ms). Execute id is 734.
此时产生了2个闪回版本。
第3次更新数据:
SQL> update TB_SHAHHUI set CITY='GUANGZHOU' WHERE ID='1';
affect rows 1
used time: 6.425(ms). Execute id is 735.
SQL> commit;
executed successfully
used time: 4.219(ms). Execute id is 736.
SQL> select versions_endtrxid, id,CITY from TB_SHAHHUI versions between timestamp '2022-05-19 22:46:45' and sysdate;
LINEID VERSIONS_ENDTRXID ID CITY
---------- -------------------- ----------- ---------
1 NULL 1 GUANGZHOU
2 7045 1 SHANGHAI
3 7044 1 SHENZHEN
4 7043 1 WUHAN
used time: 15.669(ms). Execute id is 737.
此时产生了3个闪回版本。
总结:在UNDO_RETENTION设置的时间内,修改多少次,就会产生多少个闪回版本。
社区地址:https://eco.dameng.com




