暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DM数据库闪回技术

原创 bxf3000 2022-06-17
1566


       当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。闪回技术主要是通过回滚段存储的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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论