ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Flashback Drop的应用与限制

Flashback Drop的应用与限制

原创 Linux操作系统 作者:atlantisholic 时间:2011-09-07 15:56:34 0 删除 编辑
一、Flashback drop功能
    flashback drop特性从Oracle10g开始才有的,这个新特性,允许你从当前数据库中恢复一个被drop了的对象。在执行drop操作时,现在Oracle不是真正删除它,而是将该对象的相关信息自动放入回收站(recycle bin)。recycle bin是一个存储被删除对象信息的逻辑容器,实际上当某个对象被删除,它在所属表空间所占的空间被不会被释放,同时它的相关信息被记录到recycle bin中,在recycle bin中,每一个被删除的对象都有一个唯一的名字。当某个对象需要分配新的空间,而此时表空间不足时,那么ORACLE会以FIFO方式释放recycle bin中的对象所占用的空间,然后把这些空间分配给需要空间的对象使用。
    在oracle10g中,flashback drop的这个功能是默认启动的。对于想进行FLASHABACK DROP操作的用户,必须授予FLASHBACK权限。
不过flashback drop也有一些限制:
1) 对于非SYSTEM表空间,同时也是本地管理的表空间才能使用flashback drop功能。不过如果一个表属于非SYSTEM的本地管理表空间,其依赖的对象位于字典管理的表空间,这些对象也能够能到RECYCLE BIN的保护。
2) 一个对象保存在Recycle Bin的时间是没有保证的。这个时间会由影响空间的系统活动决定。
3) Recycle bin中的对象不允许进行DML和DDL操作。
4) 由于安全原因,定义的VPD和FGA表策略不会被保护(但是,使用标准数据库审计还是能够监控回收站中表的操作)。
5) 索引组织表不受保护

 

 


下面具体演示一下flashback drop的功能:
SQL> conn / as sysdba;
已连接。
SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------
recyclebin                           string      on
--关闭recycle bin,也就是关闭flashback drop功能
SQL> alter system set recyclebin=off;
系统已更改。
SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------
recyclebin                           string      OFF
SQL> alter system set recyclebin=on;
系统已更改。
SQL> show parameter recyclebin
NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------
recyclebin                           string      ON
SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order b
y droptime;
未选定行
SQL> create table dept_test as select * from scott.dept;
表已创建。
SQL> drop table dept_test;
表已删除。
SQL> show recyclebin
SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order b
y droptime;
未选定行
此时删除的表并没有放到recycle bin之中,因为我们是用SYS用户建立dept_test表的,其默认的存储位置就是SYSTEM表空间。
SQL> create table dept_test tablespace test as select * from scott.dept;
表已创建。
SQL> drop table dept_test;
表已删除。
SQL> show recyclebin
ORIGINAL NAME  RECYCLEBIN NAME                 OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
DEPT_TEST      BIN$1/cPW58fSmO0AKuCRetDGQ==$0  TABLE        2007-05-14:23:08:33
也可以查询dba_recyclebin视图获得对象信息
SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order b
y droptime;
OWNER                          OBJECT_NAME
------------------------------ ------------------------------
ORIGINAL_NAME                    DROPTIME
-------------------------------- -------------------
SYS                            BIN$1/cPW58fSmO0AKuCRetDGQ==$0
DEPT_TEST                        2007-05-14:23:08:33
SQL> create table dept_test tablespace test as select * from scott.dept;
表已创建。
SQL> drop table dept_test;
表已删除。
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME               OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
DEPT_TEST       BIN$kY10xbDpSu+M9fzXXLXNgQ==$0 TABLE        2007-05-14:23:10:28
DEPT_TEST       BIN$1/cPW58fSmO0AKuCRetDGQ==$0 TABLE        2007-05-14:23:08:33
可以见到,每一个对象在被删除后放入recycle bin中都会有一个唯一的名字。这时我们可以查询recycle bin中被删除的表的数据:
SQL> select count(*) from "BIN$kY10xbDpSu+M9fzXXLXNgQ==$0";
  COUNT(*)
----------
         4
恢复recycle bin中被删除的表,如果相同的一个表被删除多次,那么恢复的时候默认将恢复最近删除的表
SQL> flashback table dept_test to before drop;
闪回完成。
SQL> select count(*) from dept_test;
  COUNT(*)
----------
         4
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
DEPT_TEST       BIN$1/cPW58fSmO0AKuCRetDGQ==$0 TABLE        2007-05-14:23:08:33
可以见到2007-05-14:23:10:28删除的那个表首先被恢复了。
--也可以指定recycle bin中的表名进行恢复
SQL> flashback table "BIN$1/cPW58fSmO0AKuCRetDGQ==$0" to before drop;
flashback table "BIN$1/cPW58fSmO0AKuCRetDGQ==$0" to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
此时被恢复的表名称仍然采用以前的名字,我们之前已经恢复一次DEPT_TEST,所以现在恢复就出现了重名,不过可以为其指定新的名字。
SQL> flashback table "BIN$1/cPW58fSmO0AKuCRetDGQ==$0" to before drop rename to d
ept_test2;
闪回完成。
SQL> select count(*) from dept_test2;
  COUNT(*)
----------
         4
当我们想删除回收站里的对象时,是不能使用DROP命令进行删除,必须使用PURGE命令,在使用PURGE命令删除表之后,这个表就不能被恢复了,因为它被彻底从recycle bin中删除了,并将释放出空间:
SQL> drop table dept_test;
表已删除。
SQL> drop table dept_test2;
表已删除。
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
DEPT_TEST       BIN$Ohxs0m6ES1e2vur+U3mgsw==$0 TABLE        2007-05-14:23:16:42
DEPT_TEST2      BIN$ANVQ1MdeQkyWRvZVZu8Bww==$0 TABLE        2007-05-14:23:16:44
SQL> drop table "BIN$Ohxs0m6ES1e2vur+U3mgsw==$0";
drop table "BIN$Ohxs0m6ES1e2vur+U3mgsw==$0"
           *
第 1 行出现错误:
ORA-38301: 无法对回收站中的对象执行 DDL/DML
SQL> purge table "BIN$Ohxs0m6ES1e2vur+U3mgsw==$0";
表已清除。
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
DEPT_TEST2      BIN$ANVQ1MdeQkyWRvZVZu8Bww==$0 TABLE        2007-05-14:23:16:44
我们也可以通过表空间一级进行清除
SQL> purge tablespace test;
表空间已清除。
这样将清空在这个表空间上所有被删除的对象并释放这些对象所点用的空间,同时在purge tablespace也可以指定user,这样将清空所属用户在这个表空间上被删除的对象所占用的空间。
SQL> purge tablespace test user scott;
表空间已清除。
--删除当前用户整个回收站里的对象
SQL> purge recyclebin;
DBA 回收站已清空。
--删除所有用户的回收站里的对象
SQL> purge dba_recyclebin;
DBA 回收站已清空。
下面测试一下当删除表的时候,其所属的对象,比如索引会不会也被放到recycel bin中:
SQL> create user test identified by test
  2  default tablespace test
  3  temporary tablespace temp;
用户已创建。
SQL> alter user test quota unlimited  on test;
用户已更改。
SQL> grant resource,connect to test;
授权成功。
SQL> conn test/test@ora10g;
已连接。
SQL> create table aa(a int);
表已创建。
SQL> insert into aa values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> create index aa_inx on aa(a);
索引已创建。
SQL> drop table aa;
表已删除。
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
AA              BIN$KmzWs8qoSg6LZdlc0mePjw==$0 TABLE        2007-05-14:23:33:16
SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order b
y droptime;
OWNER                          OBJECT_NAME
------------------------------ ------------------------------
ORIGINAL_NAME                    DROPTIME
-------------------------------- -------------------
TEST                           BIN$Kwbc5qHKT2GwaXv1Tzmjqw==$0
AA_INX                           2007-05-14:23:33:16

TEST                           BIN$KmzWs8qoSg6LZdlc0mePjw==$0
AA                               2007-05-14:23:33:16
在这里多了一个INDEX的信息。
SQL> flashback table test."BIN$KmzWs8qoSg6LZdlc0mePjw==$0" to before drop;
闪回完成。
SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order b
y droptime;
未选定行
SQL> select * from aa;
         A
----------
         1
SQL> select index_name from user_indexes;
INDEX_NAME
------------------------------
BIN$Kwbc5qHKT2GwaXv1Tzmjqw==$0
我们可以看到,相关的索引被回收了,但它的名称并没有恢复到之前的名称,而是保留着recycle bin中的名称。
当通过drop user xx cascade删除用户信息的时候,用户所属的对象不能放到recycle bin中。
SQL> drop user test cascade;
用户已删除。
SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order b
y droptime;
未选定行

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23071790/viewspace-706830/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-08-30

  • 博文量
    130
  • 访问量
    632730