达梦数据库闪回查询

概念:
闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。设置ENABLE_FLASHBACK 为 1 后,开启闪回功能。DM 会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由 UNDO_RETENTION 参数指定。
        开启闪回功能后,DM 会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的 UNDO 记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于 DROP 等误操作不能恢复。
闪回特性可应用在以下方面:
        1. 自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;
        2. 用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。
注意:闪回功能适用于DML误操作回退使用,不适用于drop,truncate等DDL操作。切记在生产环境慎用drop,truncate等危险命令。
 
测试模拟:
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
2、开启闪回功能
SQL> SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);
DMSQL 过程已成功完成
已用时间: 6.101(毫秒). 执行号:60201.
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.874(毫秒). 执行号:60202.
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
已用时间: 2.885(毫秒). 执行号:60203.
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
4、修改回滚段记录保留时间
SQL> SP_SET_PARA_DOUBLE_VALUE (1, 'UNDO_RETENTION', 1200);
DMSQL 过程已成功完成
已用时间: 2.992(毫秒). 执行号:60205.
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
已用时间: 2.795(毫秒). 执行号:60206.
SQL> ALTER SYSTEM SET 'undo_retention'=1500 BOTH;
DMSQL 过程已成功完成
已用时间: 4.387(毫秒). 执行号:60207.
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 1500.000000 90.000000    SYS
已用时间: 2.916(毫秒). 执行号:60208.
---------------------------------------------------------------------------------------------------------------------------------------
注:上述内容转载至https://blog.csdn.net/weixin_52814866/article/details/125105327。
5、闪回测试
创建测试表
SQL> create table td1(i int,name varchar(10));
操作已执行
已用时间: 6.403(毫秒). 执行号:61600.
(1)插入删除场景模拟
SQL> insert into td1 values(1,'jjs');
影响行数 1
已用时间: 1.451(毫秒). 执行号:61601.
SQL> commit;
操作已执行
已用时间: 1.416(毫秒). 执行号:61602.
SQL> select sysdate();
行号    sysdate()         
---------- -------------------
1          2022-11-08 09:48:02
已用时间: 0.370(毫秒). 执行号:61603.
SQL> delete from td1 where i=1;
影响行数 1
已用时间: 1.041(毫秒). 执行号:61604.
SQL> commit;
操作已执行
已用时间: 2.696(毫秒). 执行号:61605.
SQL> select sysdate();
行号    sysdate()         
---------- -------------------
1          2022-11-08 09:48:23
已用时间: 0.259(毫秒). 执行号:61606.
查看删除之前数据
SQL> select * from td1 when timestamp'2022-11-08 09:48:02';
行号    i          name
---------- ----------- ----
1          1          jjs
已用时间: 0.871(毫秒). 执行号:61607.
(2)清空表(truncate)场景模拟
SQL> truncate table td1;
操作已执行
已用时间: 6.376(毫秒). 执行号:61609.
查询清空表数据之前的记录
SQL> select * from td1 when timestamp'2022-11-08 09:48:02';
未选定行
已用时间: 0.487(毫秒). 执行号:61610.
注:上述实验说明表数据的闪回查询在truncate操作后会被清空。
(3)数据更新场景模拟
SQL> insert into td1 values(2,'JUST');
影响行数 1
已用时间: 2.581(毫秒). 执行号:61611.
SQL> commit;
操作已执行
已用时间: 0.791(毫秒). 执行号:61612.
SQL> select sysdate();
行号    sysdate()         
---------- -------------------
1          2022-11-08 09:57:33
已用时间: 0.274(毫秒). 执行号:61613.
SQL> update td1 set name='where' where i=2;
影响行数 1
已用时间: 0.969(毫秒). 执行号:61614.
SQL> commit;
操作已执行
已用时间: 0.648(毫秒). 执行号:61615.
SQL> select sysdate();
行号    sysdate()         
---------- -------------------
1          2022-11-08 09:57:56
已用时间: 0.175(毫秒). 执行号:61616.
查询更新前的数据
SQL> select * from td1 when timestamp'2022-11-08 09:57:33';
行号    i          name
---------- ----------- ----
1          2          JUST
已用时间: 0.748(毫秒). 执行号:61617.
(4)修改表字段场景模拟
SQL> update td1 set name='what' where i=2;
影响行数 1
已用时间: 1.926(毫秒). 执行号:61618.
SQL> commit;
操作已执行
已用时间: 1.305(毫秒). 执行号:61619.
SQL> select sysdate();
行号    sysdate()         
---------- -------------------
1          2022-11-08 09:59:35
已用时间: 0.398(毫秒). 执行号:61620.
SQL> alter table td1 add column(jobname varchar(20));
操作已执行
已用时间: 14.671(毫秒). 执行号:61621.
查询修改表字段前的数据
SQL> select * from td1 when timestamp'2022-11-08 09:57:33';
未选定行
已用时间: 1.161(毫秒). 执行号:61622.
注:说明修改表字段的操作会使表的闪回查询失效。
posted @   myflyand  阅读(614)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示