oracle 闪回 timestam,oracle flashback特性(1.1)--闪回查询之As of timestamp

[@more@]

正如前言中所提,FlashbackQuery是利用多版本读一致性的特性从UNDO表空间读取操作前的记录数据!

提示:什么是多版本读一致性

Oracle采用了一种非常优秀的设计,通过undo数据来确保写不堵塞读,简单的讲,不同的事务在写数据时,会将数据的前映像写入undo表空间,这样如果同时有其它事务查询该表数据,则可以通过undo表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。

flashback query有多种方式构建查询记录集(注意,要使用flashback的特性,必须启用自动撤销管理表空间,什么,你想问什么是自动撤销管理表空间?这个,说来话长啊~~~请注意关注本篇外传),记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在undo表空间中不同事务时的前映象。用法与标准查询非常类似,要通过flashback query查询undo中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn(基于scn)即可。

1、As of timestamp的示例:

先创建一个很简单的表并插入一些记录用于测试:

JSSWEB> create table jss_tb1 (id,vl) as

2 select rownum,oname from(select substr(object_name,1,1) oname from dba_objects

3 group by substr(object_name,1,1) order by 1)

4 where rownum<=20;

已创建20行。

JSSWEB> select * from jss_tb1;

ID VL

---------- --------------------

1 A

2 B

3 C

4 D

5 E

6 F

7 G

8 H

9 I

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

已选择20行。

删除几条记录并提交:

JSSWEB> delete from jss_tb1 where id<10;

已删除9行。

JSSWEB> commit;

提交完成。

JSSWEB> select * from jss_tb1;

ID VL

---------- --------------------

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

已选择11行。

你看,这个时候jss_tb1表中id<10的记录均已被删除,假设过了一会儿你发现删除操作执行有误,仍需找回那些被误删的记录该怎么办呢?使用备份恢复?如果是在8i,恐怕是需要这样,自9i之后,使用flashback query的特性,我们可以很轻松的恢复记录(注意并不是任何情况下都可以恢复哟,后面会讲到制约flashback query的一些因素,我们这里举的都是理想条件下的例子),假设当前距离删除数据已经有5分钟左右的话:

JSSWEB> select * from jss_tb1 as of timestamp sysdate-5/1440;

ID VL

---------- --------------------

1 A

2 B

3 C

4 D

5 E

6 F

7 G

8 H

9 I

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

已选择20行。

你看,我们通过增加as of timestamp的语法,就可以到undo表空间中查找到5分钟之前的记录前镜像,使用它我们就可以很轻易的并且迅速的将记录恢复:

JSSWEB> insert into jss_tb1

2 select * from jss_tb1 as of timestamp sysdate-5/1440

3 where id<10;

已创建9行。

JSSWEB> commit;

提交完成。

JSSWEB> select * from jss_tb1;

ID VL

---------- --------------------

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

1 A

2 B

3 C

4 D

5 E

6 F

7 G

8 H

9 I

已选择20行。

提示:

as of timestamp|scn的语法是自9iR2后才开始提供支持,如果是9iR1版本,需要使用DBMS_FLASHBACK包来应用flashback query的特性。

如上述示例中所表示的,as of timestamp的确非常易用,但是在某些情况下,我们建议使用as of scn的方式执行flashback query,比如需要对多个相互有主外键约束的表进行恢复时,如果使用as of timestamp的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过scn方式则能够确保记录的约束一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值