达梦闪回技术
闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。设置ENABLE_FLASHBACK 为 1 后,开启闪回功能。DM 会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由 UNDO_RETENTION 参数指定。增大这个参数可能会导致更多的UNDO表空间使用,不易回收,影响性能。这种用空间换时间的策略也存在限制,不可能无限地恢复任何时间点的误操作。针对那些“及时”发现的误操作,使用该方法进行恢复是非常有效的
开启闪回功能后,DM 会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的 UNDO 记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于 DROP 等误操作不能恢复。闪回特性可应用在以下方面:
1.自我维护过程中的修复:当一些记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;
2.用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。
测试示例
查看系统ENABLE_FLASHBACK和UNDO_RETENTION
修改回滚段保留时间(单位秒)和打开闪回功能
sp_set_para_double_value(1,'UNDO_RETENTION',9000.000);
sp_set_para_value(1,'ENABLE_FLASHBACK',1);
创建测试表
修改表数据并查看当前系统时间
修改之后查询表结果和闪回查询表指定时刻没修改之前做对比
闪回版本查询,可以查看历史记录
select versions_starttime,versions_endtime,id,name from t1 versions between timestamp '2021-05-12 11:11:15' and sysdate;
通过闪回版本查询定位到具体时间点,可恢复指定时间之前的数据
将t1表备份
create table t1_bak select * from t1
创建临时表存放指定时间的闪回数据
create table t1_tmp select * from t1 when timestamp '2021-05-12 11:18:03'
删除t1表
drop table t1
新建t1表,并将临时表t1_tmp的数据导入进去
create table t1 as select * from t_tmp
也可通过闪回事务查询以视图V$FLASHBACK_TRX_INFO查询在事务级对数据库所做的更改