Oracle 10g的闪回机制【20081016】
- 格式:doc
- 大小:113.50 KB
- 文档页数:9
第5章Oracle 10g的闪回机制
5.1 简介
在Oracle中,对于提交的变化,是没有办法回退的。所以这时候就可能存在这样一种情况,对于表做了DML操作,并且在提交后才发现,对表的操作是错误的,此时我们没有办法把提交的错误数据回滚到初始的正确状态;同时,和可能存在一种情况,错误的对表执行了drop操作,由于DDL语句在执行后隐含的含有提交操作,所以这种情况也没有办法把执行了的错误DROP操作回滚的DROP语句执行前的状态。
对于第一种情况,在Oracle 9i版本若发现及时,可以通过dbms_flashback闪回,获取到执行错误操作前的数据,然后来执行修复。但是,由于回滚段中的数据可能被覆盖掉,所以通过这种闪回就有个限制。
对于第二种情况,在Oracle 10g以前的各个版本,只能执行数据库的不完整修复才能消除引入的错误操作(DROP TABLE).
下面介绍ORACLE 10G引入的闪回,10G引入的闪回更加灵活,提供的功能也更加强大。
10G引入的删除可分为4种:Flashback Database、Flashback Drop、Flashback Query、Flashback Versions Query、Flashback Transaction Query。
5.2 Flashback drop
在10G以前的版本中,如果误操作DROP了某张表,那么只能采取数据库的不完整修复来做恢复数据库,但10g版本新增的这个特性,提供了一种对误DROP表的修复方式。
●先做一个简单实验的例子:
先创建表create table t( a varchar2(30));
模拟错误操作DROP表drop table t;
此时闪回表flashback table t to before drop;
闪回表T后,表T从误操作后恢复了,并且可以对表T做常规操作。
●Flashback drop table的原理:
在较早的Oracle版本中,drop表时也会从数据字典中彻底删除对这个表的所有引用,恢复被drop 掉的表的唯一方法是执行时间点恢复。
而在10g的Oracle数据库中,drop table命令的实现已经发生变化:指定的表不再被删除,而是被重命名。
下面用个例子来说明:
新建一个用户,授予必要的权限,本章的例子都在用户fox完成。
create user fox identified by sys default tablespace users;
create user fox identified by sys default tablespace users;
grant create session,create table,flashback any table,debug connect session,create
type,create view,create sequence to fox;
alter user fox quota unlimited on users;
以fox用户建测试表并插入一条记录,
Create table test(a varchar2(4000));
Insert into test(a) values(‘测试flashback drop table’);
Commit;
此时模拟误操作,drop表test:
Drop table test;
由于此用户目前只是创建了一个对象TEST,但是已经被drop掉。但是我们查询
SQL> Select count(*) from user_objects;
COUNT(*)
----------
1
还存在一个对象,查询出这个对象
SQL> select object_name from user_objects;
OBJECT_NAME
-------------------------------------------
BIN$6PH8zhiWR7yzokLGBvg49A==$0
现在来确定下。“BIN$6PH8zhiWR7yzokLGBvg49A==$0”是个什么对象。
SQL> select * from "BIN$H+Wwg3weRqSSlBI3UJOKbg==$0";
查询结果是
A
------------------------------------------------------
测试flashback drop table
此实验证实了我们开始drop的表test,实际上并没有被物理删除,只是被系统自动重新命名了。
恢复表
flashback table test to before drop;
●Oracle的“回收站”
参数RECYCLEBIN(值为ON或者OFF)用来控制是否开启数据库的flashback drop 特性。当此参数值设为OFF时,drop table时不会把表放进“回收站”,而是直接drop掉。当此参数值设为ON时,drop table是会把表放进“回收站”,并可以通过flashback drop特性来修复。
下面在以表test为例来说明:
SQL> drop table test;
SQL> select a.object_name, a.original_name
2 from recyclebin a, user_objects b
3 where a.object_name = b.object_name;
OBJECT_NAME ORIGINAL_NAME
------------------------------ ------------------
BIN$/WDtTeRnQ3io2IQh/yZNJA==$0 TEST
SQL> select a from "BIN$/WDtTeRnQ3io2IQh/yZNJA==$0";
A
-----------------------------------------------------
测试flashback drop table
通过查询“回收站”视图,可以知道表TEST在被DROP后,被系统自动重命名为“BIN$/WDtTeRnQ3io2IQh/yZNJA==$0”。
●管理“回收站”