达梦SQL高级特性:闪回

达梦SQL中的闪回分为闪回表和闪回查询。

所谓闪回表,指的是数据库联机时,通过只回退对指定表及其相关对象所做的更改,将表里的数据回退到历史的某个时间点,而不需要执行传统的时间点恢复操作。

原理是,利用roll表空间内记录的数据的被改变前的值(也就是说,因保留时间超过了初始化参数 UNDO_RETENTION 所指定的值,从而导致闪回表时所需要的 UNDO 数据被其他事务覆盖的话,那么就不能将表中数据恢复到指定的时间)。

要进行闪回操作,首先要打开闪回。可以在ini文件中修改参数,也可以动态地修改:

ALTER SYSTEM SET ‘ENABLE_FLASHBACK’=1;

修改参数后,建立测试用的表flash,其中包含了10条数据,分别为数字1-10;

 查询系统视图V$RLOG,记录此时的CUR_LSN=186755:

 

此时,删除COL=1的这条数据:

再使用LSN 186755,进行表闪回操作。但这时可能会发现报错[-2007]:

这很有可能是因为使用的版本不支持闪回表的操作。但是,对于大部分DM8的版本,均支持闪回查询子句。语法是: 

select * from ...
WHEN TIMETSAMP <时间戳> | AS OF TIMESTANP <时间戳> | AS OF SCN <lsn版本号> ;

这里试验使用闪回查询,看是否能得到期望的结果集,但是报错[-9801]闪回版本已过期:

 这是因为,在执行这条闪回查询语句之前,经过了足够久的时间,导致lsn超过了UNDO_RETENTION指定的值。

参数UNDO_RETENTION,在dm.ini中定义:

默认情况为90.000,单位秒。也就是说,超过90秒的数据就无法被闪回表或闪回查询操作获取了。

而根据闪回的技术原理来说,不建议将此参数设置过大,因为undo_retention越大,对roll表空间的开销越大。

这时,再查询一次当前LSN:

再根据当前的lsn=187147,在表flash上进行一次DML操作,观察闪回查询结果和当前表中的数据:

 

可以观察到,闪回查询达到了预期的效果。需要注意的是,闪回查询完全依赖于回滚段的管理,对表的drop等误操作无能为力;也就是说,闪回查询只能查询到DML影响的数据,只有闪回表才能恢复DDL造成的影响。

除了闪回查询子句,还可以进行了闪回区间查询:

上图代表了,在187811到187318这个LSN代表的时段内,在LSN=187318这个时刻,flash表被删除了一行col=3的数据,同时添加了一行col=999的数据。

DM数据库SQL语言使用手册:【闪回】

达梦在线服务平台:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值