侧边栏壁纸
博主头像
与晚风述往事博主等级

万般皆下品,唯有读书高。

  • 累计撰写 149 篇文章
  • 累计创建 29 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

Flashback Query

与晚风述往事
2021-12-28 / 0 评论 / 0 点赞 / 289 阅读 / 1,078 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-12-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

虽然我们可以使用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,表的数据如下:
image.png
我们在进行维护时,由于“手快”误执行了update全表的语句,将表中NAME字段的全部数据都改成了王五,语句如下:
image.png
执行后再次查询数据就会发现数据已被更新,如下图所示:
image.png
这时,我们想使用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');

image.png
如果我们初次指定的时间戳没有查到想要的数据,则需要将时间戳改的更早些,然后再次查询。我这里也是多次闪回查询后,才看到执行update语句前的数据。

由此,我们就得到了update前的一个时间戳,可以使用Flashback Table将数据闪回到update前的时间点了。我这里就不再写了后续的闪回表步骤了,如有需要,请看这里Flashback Table(闪回表)

0

评论区