介绍
虽然我们可以使用Flashback Table(闪回表)进行数据误操作后的恢复,但聊到这里你会发现一个问题。什么叫误操作?既然都误操作了,那肯定不会在操作时记录当时的SCN(数据库变更号)或TIMESTAMP(时间戳)。在不记得误操作的具体时间点时,我们又该怎么进行闪回表的操作呢?
这个时候我就要教你另一种闪回了,它就是闪回查询。闪回查询和闪回表有点类似,但又略有不同。它们都是基于UNDO的特性,只不过不同之处在于闪回表是使用UNDO将表还原到历史的某个时间点上,而闪回查询是根据UNDO去查询历史某个时间点的表数据。根据历史某个时间点的数据,再与当前表的数据对比,我们还怕找不到误操作的时间戳吗?
语法
闪回查询的语法跟普通的查询语句的区别仅在于多了as of关键字,以下为闪回查询的语法:
AS OF { SCN | TIMESTAMP } expr
说明:
- SCN expr 查询指定的系统更改号(SCN)时表中的数据。
- TIMESTAMP expr 查询指定的时间戳时表中的数据,该时间戳与指定的时间戳可能有3秒的误差。
先决条件
在执行闪回查询前,必须要满足以下条件:
- 当前用户必须在执行闪回查询的表中具有FLASHBACK权限或者具有FLASHBACK ANY TABLE系统权限。
- 当前用户必须在执行闪回查询的表中具有SELECT权限。
案例
以下是一个简单的闪回查询使用例子,可以看看熟悉下用法。
TIMESTAMP闪回查询
假设有表testa,表的数据如下:
我们在进行维护时,由于“手快”误执行了update全表的语句,将表中NAME字段的全部数据都改成了王五,语句如下:
执行后再次查询数据就会发现数据已被更新,如下图所示:
这时,我们想使用Flashback Table将表闪回到历史时间点,但是根本不知道要闪回到哪个时间点上。这时,就需要借助于Flashback Query特性来一点点的推算执行update语句时的时间,直到找到更新前的数据。闪回语句如下:
select * from testa as of timestamp to_timestamp('2021-12-28 18:20:47','yyyy-mm-dd hh24:mi:ss');
如果我们初次指定的时间戳没有查到想要的数据,则需要将时间戳改的更早些,然后再次查询。我这里也是多次闪回查询后,才看到执行update语句前的数据。
由此,我们就得到了update前的一个时间戳,可以使用Flashback Table将数据闪回到update前的时间点了。我这里就不再写了后续的闪回表步骤了,如有需要,请看这里Flashback Table(闪回表)。
评论区