达梦DM8之闪回功能测试
        当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。
        闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。设置ENABLE_FLASHBACK 为 1 后,开启闪回功能。DM 会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由 UNDO_RETENTION 参数指定。

开启闪回功能后,DM 会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的 UNDO 记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于 DROP 等误操作不能恢复。

闪回特性可应用在以下方面:
        1. 自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;
        2. 用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。

注意:闪回功能适用于DML误操作回退使用,不适用于drop,truncate等DDL操作。切记在生产环境慎用drop,truncate等危险命令。

1. 检查闪回是否开启
查询闪回功能状态,数据库默认关闭(0-关闭,1-打开)。示例语句如下所示:
SQL>  select para_name,para_value,default_value,para_type from v$dm_ini where para_name like '%FLASHBACK%';
行号     PARA_NAME        PARA_VALUE DEFAULT_VALUE PARA_TYPE
---------- ---------------- ---------- ------------- ---------
1          ENABLE_FLASHBACK 0          0             SYS
已用时间: 3.806(毫秒). 执行号:702.
SQL>

2. 开启数据库闪回功能
SQL> SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);
DMSQL 过程已成功完成
已用时间: 3.869(毫秒). 执行号:704.
-- 检查闪回功能是否开启
SQL> select para_name,para_value,default_value,para_type from v$dm_ini where para_name like '%FLASHBACK%';
行号     PARA_NAME        PARA_VALUE DEFAULT_VALUE PARA_TYPE
---------- ---------------- ---------- ------------- ---------
1          ENABLE_FLASHBACK 1          0             SYS
已用时间: 2.676(毫秒). 执行号:705.

SQL> SELECT SF_GET_PARA_VALUE (1, 'ENABLE_FLASHBACK') in_file,
       SF_GET_PARA_VALUE (2, 'ENABLE_FLASHBACK') in_mem;2

行号     IN_FILE              IN_MEM              
---------- -------------------- --------------------
1          1                    1
已用时间: 3.265(毫秒). 执行号:706.
SQL>

3. 查看回滚段记录保存时间
        由于回滚段会自动清理,所以需要延长回滚记录的保留时间,单位是秒。回滚段参数太大容易引发回滚段膨胀,需要合理的规划和设置。
SQL> select para_name,para_value,default_value,para_type from v$dm_ini where para_name like '%UNDO_RETENTION%';

行号     PARA_NAME      PARA_VALUE DEFAULT_VALUE PARA_TYPE
---------- -------------- ---------- ------------- ---------
1          UNDO_RETENTION 90.000000  90.000000     SYS
已用时间: 2.836(毫秒). 执行号:707.
SQL> 
-- 这里设置为 1200s。示例语句如下所示:
SQL> SP_SET_PARA_DOUBLE_VALUE (1, 'UNDO_RETENTION', 1200);
DMSQL 过程已成功完成
已用时间: 4.311(毫秒). 执行号:709.
SQL> 
或者
SQL> ALTER SYSTEM SET 'undo_retention'=1200 BOTH;
DMSQL 过程已成功完成
已用时间: 4.475(毫秒). 执行号:710.
SQL> 
-- 检查修改后的UNDO_RETENTION
SQL> select para_name,para_value,default_value,para_type from v$dm_ini where para_name like '%UNDO_RETENTION%';

行号     PARA_NAME      PARA_VALUE  DEFAULT_VALUE PARA_TYPE
---------- -------------- ----------- ------------- ---------
1          UNDO_RETENTION 1200.000000 90.000000     SYS
已用时间: 3.943(毫秒). 执行号:711.
SQL>

4. 闪回测试
4.1 测试delete删除表数据恢复
1) 构建测试数据
create table PERSON.PERSON1 as select * from PERSON.PERSON;
SQL> select * from PERSON.PERSON1;
行号     PERSONID    SEX NAME      EMAIL         PHONE      
---------- ----------- --- --------- ------------- -----------
1          1           F   李丽    lily@sina.com 02788548562
2          2           M   王刚                  02787584562
3          3           M   李勇                  02782585462
4          4           F   郭艳                  02787785462
5          5           F   孙丽                  13055173012
6          6           M   黄非                  13355173012
7          7           F   王菲                  13255173012
8          8           M   张平                  13455173012
9          9           M   张红                  13555173012
10         10          F   刘佳                  13955173012
11         11          F   王南                  15955173012
12         12          F   李飞                  15954173012
13         13          F   张大海               15955673012
14         14          F   王宇轩               15955175012
15         15          F   桑泽恩               15955173024
16         16          F   刘青                  15955173055
17         17          F   杨凤兰 NULL          02785584662
17 rows got
已用时间: 0.265(毫秒). 执行号:713.
SQL>

2)删除数据测试闪回功能
SQL> select sysdate();
行号     SYSDATE()          
---------- -------------------
1          2022-06-02 17:23:41
已用时间: 0.664(毫秒). 执行号:714.

---- 整张表数据delete删除掉

SQL> delete from  PERSON.PERSON1;
影响行数 17
已用时间: 1.068(毫秒). 执行号:715.
SQL> commit;
操作已执行
已用时间: 1.826(毫秒). 执行号:716.

-- 此时可以看到表中已经没有任何数据记录了
SQL> select * from PERSON.PERSON1;
未选定行
已用时间: 0.265(毫秒). 执行号:717.
SQL>

-- 通过闪回查询WHEN TIMESTAMP查看原始数据:
SQL> select * from PERSON.PERSON1 WHEN TIMESTAMP '2022-06-02 17:23:41';
行号     PERSONID    SEX NAME      EMAIL         PHONE      
---------- ----------- --- --------- ------------- -----------
1          1           F   李丽    lily@sina.com 02788548562
2          2           M   王刚                  02787584562
3          3           M   李勇                  02782585462
4          4           F   郭艳                  02787785462
5          5           F   孙丽                  13055173012
6          6           M   黄非                  13355173012
7          7           F   王菲                  13255173012
8          8           M   张平                  13455173012
9          9           M   张红                  13555173012
10         10          F   刘佳                  13955173012
11         11          F   王南                  15955173012
12         12          F   李飞                  15954173012
13         13          F   张大海               15955673012
14         14          F   王宇轩               15955175012
15         15          F   桑泽恩               15955173024
16         16          F   刘青                  15955173055
17         17          F   杨凤兰 NULL          02785584662
17 rows got
已用时间: 0.901(毫秒). 执行号:718.

3)通过闪回功能恢复表数据
SQL> insert into PERSON.PERSON1 select * from PERSON.PERSON1 WHEN TIMESTAMP '2022-06-02 17:23:41';
影响行数 17
已用时间: 1.635(毫秒). 执行号:721.
SQL> commit;
操作已执行
已用时间: 1.993(毫秒). 执行号:722.
SQL> select * from PERSON.PERSON1;
行号     PERSONID    SEX NAME      EMAIL         PHONE      
---------- ----------- --- --------- ------------- -----------
1          1           F   李丽    lily@sina.com 02788548562
2          2           M   王刚                  02787584562
3          3           M   李勇                  02782585462
4          4           F   郭艳                  02787785462
5          5           F   孙丽                  13055173012
6          6           M   黄非                  13355173012
7          7           F   王菲                  13255173012
8          8           M   张平                  13455173012
9          9           M   张红                  13555173012
10         10          F   刘佳                  13955173012
11         11          F   王南                  15955173012
12         12          F   李飞                  15954173012
13         13          F   张大海               15955673012
14         14          F   王宇轩               15955175012
15         15          F   桑泽恩               15955173024
16         16          F   刘青                  15955173055
17         17          F   杨凤兰 NULL          02785584662
17 rows got
已用时间: 0.309(毫秒). 执行号:723.
SQL>

4.2 测试insert更新表数据恢复
1)insert更新数据
insert into PERSON.PERSON1 values (20,'M','王20','ily@sina.com','02785584662');
insert into PERSON.PERSON1 values (21,'M','李21','ily@sina.com','02785584662');
commit;

SQL> select sysdate();
行号     SYSDATE()          
---------- -------------------
1          2022-06-02 17:40:35
已用时间: 0.350(毫秒). 执行号:724.
SQL> insert into PERSON.PERSON1 values (20,'M','王20','ily@sina.com','02785584662');
insert into PERSON.PERSON1 values (21,'M','李21','ily@sina.com','02785584662');DMSQL 过程已成功完成
已用时间: 0.840(毫秒). 执行号:725.
SQL> 
影响行数 1
已用时间: 0.553(毫秒). 执行号:726.
SQL> commit;
操作已执行
已用时间: 1.198(毫秒). 执行号:727.
SQL> select * from PERSON.PERSON1;
行号     PERSONID    SEX NAME      EMAIL         PHONE      
---------- ----------- --- --------- ------------- -----------
1          1           F   李丽    lily@sina.com 02788548562
2          2           M   王刚                  02787584562
3          3           M   李勇                  02782585462
4          4           F   郭艳                  02787785462
5          5           F   孙丽                  13055173012
6          6           M   黄非                  13355173012
7          7           F   王菲                  13255173012
8          8           M   张平                  13455173012
9          9           M   张红                  13555173012
10         10          F   刘佳                  13955173012
11         11          F   王南                  15955173012
12         12          F   李飞                  15954173012
13         13          F   张大海               15955673012
14         14          F   王宇轩               15955175012
15         15          F   桑泽恩               15955173024
16         16          F   刘青                  15955173055
17         17          F   杨凤兰 NULL          02785584662
18         20          M   王20     ily@sina.com  02785584662
19         21          M   李21     ily@sina.com  02785584662
19 rows got
已用时间: 0.285(毫秒). 执行号:728.
SQL>

2)查询更新前的数据
SQL> select * from PERSON.PERSON1 WHEN TIMESTAMP '2022-06-02 17:40:35';
行号     PERSONID    SEX NAME      EMAIL         PHONE      
---------- ----------- --- --------- ------------- -----------
1          1           F   李丽    lily@sina.com 02788548562
2          2           M   王刚                  02787584562
3          3           M   李勇                  02782585462
4          4           F   郭艳                  02787785462
5          5           F   孙丽                  13055173012
6          6           M   黄非                  13355173012
7          7           F   王菲                  13255173012
8          8           M   张平                  13455173012
9          9           M   张红                  13555173012
10         10          F   刘佳                  13955173012
11         11          F   王南                  15955173012
12         12          F   李飞                  15954173012
13         13          F   张大海               15955673012
14         14          F   王宇轩               15955175012
15         15          F   桑泽恩               15955173024
16         16          F   刘青                  15955173055
17         17          F   杨凤兰 NULL          02785584662
17 rows got
已用时间: 1.191(毫秒). 执行号:729.
SQL>

4.3 闪回查询指定TRXID

1)构造修改记录
update PERSON.PERSON1 set NAME = '李丽丽' where PERSONID=1;
update PERSON.PERSON1 set NAME = '王刚刚' where PERSONID=2;
commit;

SQL> update PERSON.PERSON1 set NAME = '李丽丽' where PERSONID=1;
update PERSON.PERSON1 set NAME = '王刚刚' where PERSONID=2;
commit;
2   3   DMSQL 过程已成功完成
已用时间: 2.739(毫秒). 执行号:739.
SQL> 
SQL> select * from PERSON.PERSON1;
行号     PERSONID    SEX NAME      EMAIL         PHONE      
---------- ----------- --- --------- ------------- -----------
1          1           F   李丽丽 lily@sina.com 02788548562
2          2           M   王刚刚               02787584562
3          3           M   李勇                  02782585462
4          4           F   郭艳                  02787785462
5          5           F   孙丽                  13055173012
6          6           M   黄非                  13355173012
7          7           F   王菲                  13255173012
8          8           M   张平                  13455173012
9          9           M   张红                  13555173012
10         10          F   刘佳                  13955173012
11         11          F   王南                  15955173012
12         12          F   李飞                  15954173012
13         13          F   张大海               15955673012
14         14          F   王宇轩               15955175012
15         15          F   桑泽恩               15955173024
16         16          F   刘青                  15955173055
17         17          F   杨凤兰 NULL          02785584662
17 rows got
已用时间: 0.298(毫秒). 执行号:740.

2)通过闪回版本查询TRXID

SQL> SELECT VERSIONS_STARTTRXID,VERSIONS_ENDTRXID, VERSIONS_OPERATION,NAME FROM PERSON.PERSON1 VERSIONS BETWEEN TIMESTAMP '2022-06-02 18:01:34' AND SYSDATE;
行号     VERSIONS_ENDTRXID    NAME     
---------- -------------------- ---------
1          NULL                 李丽丽
2          NULL                 王刚刚
3          NULL                 李勇
4          NULL                 郭艳
5          NULL                 孙丽
6          NULL                 黄非
7          NULL                 王菲
8          NULL                 张平
9          NULL                 张红
10         NULL                 刘佳
11         NULL                 王南
12         NULL                 李飞
13         NULL                 张大海
14         NULL                 王宇轩
15         NULL                 桑泽恩
16         NULL                 刘青
17         NULL                 杨凤兰
18         21390                李丽
19         21390                王刚
19 rows got
已用时间: 1.390(毫秒). 执行号:742.
SQL>

3)根据 TRXID 确定版本
SQL> select * from PERSON.PERSON1 WHEN TRXID 21390;
行号     PERSONID    SEX NAME      EMAIL         PHONE      
---------- ----------- --- --------- ------------- -----------
1          1           F   李丽    lily@sina.com 02788548562
2          2           M   王刚                  02787584562
3          3           M   李勇                  02782585462
4          4           F   郭艳                  02787785462
5          5           F   孙丽                  13055173012
6          6           M   黄非                  13355173012
7          7           F   王菲                  13255173012
8          8           M   张平                  13455173012
9          9           M   张红                  13555173012
10         10          F   刘佳                  13955173012
11         11          F   王南                  15955173012
12         12          F   李飞                  15954173012
13         13          F   张大海               15955673012
14         14          F   王宇轩               15955175012
15         15          F   桑泽恩               15955173024
16         16          F   刘青                  15955173055
17         17          F   杨凤兰 NULL          02785584662
17 rows got
已用时间: 0.766(毫秒). 执行号:744.
SQL>

5. 闪回事务查询
        闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO 供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。
举例说明
例1 查询指定时间之后的事务信息,可为闪回查询操作提供参考。
SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2022-06-02 17:23:41';

更多咨询请查看:达梦在线服务平台 达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

达梦DM8之闪回查询相关推荐

  1. 达梦数据库的闪回技术

     什么是达梦数据库的闪回?          达梦数据库的闪回技术就是在事务提交以后,将事务操作的记录在回滚段中保留一段时间,以便通过用户指定的时刻,进行闪回查询,闪回技术可以在一定程度上恢复用户误操 ...

  2. 达梦DM8搭建DSC过程以及遇到的问题

    达梦DM8搭建DSC过程以及遇到的问题 DMDSC 是什么? DM DSC是一个单数据库.多实例的集群系统:具有高可用性.高性能.负载均衡等特性 DMDSC架构 DMDSC 组件: 集群主要由数据库和 ...

  3. oracle数据库dblink创建语句_3场直播丨达梦DM8数据库安装部署初体验、新基建下的国产数据库应用和发展趋势、Oracle外部表创建与使用...

    1. 循序渐进-达梦DM8数据库安装部署初体验-07/16 简介: 本讲座主要介绍达梦DM8数据库软件安装与数据库创建. 2019年5月,DM8发布. 基于新技术发展的思考和市场的需求,坚持实用性.通 ...

  4. 3场直播丨达梦DM8数据库安装部署初体验、新基建下的国产数据库应用和发展趋势、Oracle外部表创建与使用...

    1. 循序渐进-达梦DM8数据库安装部署初体验-07/16 简介: 本讲座主要介绍达梦DM8数据库软件安装与数据库创建. 2019年5月,DM8发布. 基于新技术发展的思考和市场的需求,坚持实用性.通 ...

  5. 【Nacos2.2.0适配达梦DM8数据源】

    Nacos2.2.0适配达梦DM8数据源 Nacos 从 2.2.0 版本开始,可通过 SPI 机制注入多数据源实现插件,并在引入对应数据源实现后,便可在 Nacos 启动时通过读取 applicat ...

  6. 达梦DM8全备时报错:-8069 待备份数据文件无效

    使用达梦DM8管理工具manager链接数据库,使用"备份"-->"库备份"-->"新建备份"后,创建全库备份报错: [报错信息 ...

  7. oracle9i 恢复数据库,oracle 9i使用闪回查询恢复数据库误删问题

    如果用户误删/更新了数据后,作为用户并没有什么直接的方法来进行恢复,他们必须求助DBA来对数据库进行恢复,到了Oracle9i,这一个难堪局面有所改善.Oracle 9i中提供了一项新的技术手段--闪 ...

  8. 国产化之路-统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作

    引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...

  9. oracle闪回某个时间点的数据库,oracle11g 使用闪回查询恢复表到过去某一个时间点...

    一.新建测试表并插入数据:oracle 二.模拟表数据误删并提交:测试 三.使用闪回查询来查误删前表的数据:(表误删是在15:08分左右误删,所以在15:08分以前表的数据仍是在的):spa 四.用如 ...

最新文章

  1. 恶意代码实战Lab13-01分析
  2. org.apache.jasper.JasperException: Unable to co...
  3. 前端学习(3072):vue+element今日头条管理-删除文章失败(json-bigint)
  4. Qt利用avilib实现录屏功能_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
  5. 收到字节 Offer,月薪 45k,揭秘面试流程及考点
  6. linux shell $#获取所有参数的个数 $@获取所有参数
  7. 整数输入问题一百二十九:阿基米德特性
  8. 风险管理-输入、输出、工具和技术
  9. flutter入门之理解Isolate及compute
  10. Hbase2.4.1集群安装:HMaster自动挂掉问题终于解决了
  11. 如何通便清肠快速见效_为什么有时候会一连几天没有排便?如何快速清肠通便?...
  12. ES6——Symbol属性与for...of循环迭代器
  13. 今天去google中国采访从google总部回来的工程师(多图)
  14. 【Unity】监听编辑器聚焦/激活状态OnEditorFocus
  15. 《Python编程:从入门到实践》读书笔记——第6章:字典
  16. 浙江职称英语和职称计算机考试报名,2017浙江职称计算机考试报名:丽水职称计算机报名入口...
  17. #IT人的升职加薪tips# 如何真正学习Go 语言[翻译]
  18. 基于ESB的企业服务集成平台建设之道
  19. linux脚本自动更换界面,linux自动更换壁纸脚本
  20. 纸上得来终觉浅,可以这里看一眼(一)---->栈和队列

热门文章

  1. 网络基础知识,基础拓扑结构,基础设计理念总结
  2. 学习openstack(五)
  3. Coherence(2)配置
  4. kmeans的基础原理,损失函数以及例子
  5. 剪切的文件还能恢复吗,恢复剪贴丢失的文件
  6. 关于nodejs域名重定向问题
  7. React组件(进阶--生命周期 )
  8. 致远OA表单自定义函数(取上一行金额)
  9. HP-2910/2810交换机mini-GBIC口不支持Finisar FTLF8519P2xNL模块.
  10. Jenkins 构建job无法停止问题