-- 8.3.2 Oracle 10g 的 flashback drop 功能 ( P351 )
-- 在生产环境中,可能用户会因为误操作而drop掉了有用的数据表,从而导致了严重的数据库故障,在以前的版本中,恢复这样的错误一般需要通过备份进行不完全恢复,
-- 为了加快这类用户错误的恢复过程,Oracle 10g提供了flashback drop的功能。-- Oracle 10g的flashback drop功能允许你从当前数据库中恢复一个被drop了的对象,在执行drop操作时,现在Oracle不是真正删除它,
-- 而是将该对象自动将放入回收站(RecycleBin),对于一个对象的删除,Oracle其实仅仅就是进行了类似重命名操作。-- 所谓的回收站,是一个虚拟的容器,用于存放所有被删除的对象。在回收站中,被删除的对象将占用创建时的同样的空间,你甚至还可以对已经删除的表查询,
-- 也可以利用flashback功能来恢复它,这个就是flashback drop功能。-- 回收站内的相关信息可以从recyclebin/user_recyclebin/dba_recyclebin等视图中获取,或者通过SQL*Plus的show recyclebin命令查看。-- 我们简单测试一下这个功能:
SQL> connect eygle/eygleSQL> create table t1 as select * from dba_users;SQL> select count(*) from t1;  COUNT(*)
----------
        23SQL> drop table t1;-- 现在Drop掉的表被移入回收站(Recyclebin)中:
SQL> show recyclebin;ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T1               BIN$L4JBt5KPQFix2UbAb1qBcg==$0 TABLE        2010-07-17:07:45:41-- 要恢复这个对象,只需要使用如下命令即可:
SQL> FLASHBACK TABLE t1 to BEFORE DROP;-- 如果要彻底清除这些对象,可以使用Purge命令,如:
SQL> show recyclebin;ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T1               BIN$QUNCuOTFThu5MHY9awScIQ==$0 TABLE        2010-07-17:07:48:01SQL> purge table t1;-- 使用 purge recyclebin 可以清除回收站中的所有对象;类似的可以通过purge user_recyclebin 或者 purge dba_recyclebin 来清除不同的回收站对象;
-- 通过PURGE TABLESPACE <TSNAME>,PURGE TABLESPACE <TSNAME> USER <USERNAME> 命令来选择清除回收站。-- 另外需要注意的是,当使用DROP TABLESPACE ... INCLUDING CONTENTENTS命令来删除表空间,表空间中的所有对象会被清除,包括回收站中的内容;
-- 当使用DROP USER ... CASCADE命令来删除用户时,该用户下所有的对象会被清除,包括回收站中的内容。-- 当我们想要彻底删除一个表,不想放到回收站中,可以在drop 语句中增加purge选项,如:
drop table tablename purge;-- 需要注意的是sysdba的drop操作不会被记录,Oracle也从不推荐用户使用sysdba身份创建用户对象。-- 如果我们不希望使用Oracle的recyclebin,可以通过参数禁用这个特性。-- 在Oracle 10gR1中,通过修改一个隐含参数_recyclebin为False可以禁用这个特性,在Oracle 10gR2中,recyclebin变成了一个常规参数,可以在session/system级动态修改:
SQL> show parameter recyclebin;NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- -------------
recyclebin                           string                 onSQL> alter session set recyclebin=off;SQL> alter session set recyclebin=on;SQL> alter system set recyclebin=off;SQL> show parameter recyclebinNAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ----------
recyclebin                           string                 OFFSQL> alter system set recyclebin=on;-- flashback drop 功能使得对于误drop 操作的恢复变得轻而易举。-- 但是由于flashback drop 功能的引入,一度引起很多用户的困惑,在dba_objects等视图中用户经常会看到一系列的闪回对象(名称以BIN$开头),用户担心空间得不到回收。-- 其实当出现表空间不足是,Oracle会自动回收Recyclebin占用的空间的! (略)--------------------------------------------------------------------------------------------
-- 补充 ( 学习深得 ):
-- 还可以直接 CREATE TABLE AS SELECT * FROM "RECYCLEBIN NAME";-- 如:
SQL> show recyclebin;ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
T1               BIN$L4JBt5KPQFix2UbAb1qBcg==$0 TABLE        2010-07-17:07:45:41SQL> create table t1 as select * from "BIN$L4JBt5KPQFix2UbAb1qBcg==$0";-- 此时再一次创建了表 T1,那么当你发出如下命令将会出错(因为你已经创建了表t1:SQL> FLASHBACK TABLE t1 to BEFORE DROP;-- 此时你可以在 flashback table 的同时将表重命名,如:SQL> FLASHBACK TABLE t1 to BEFORE DROP rename to t2;  -- 前提:原来中不存在名为 t2的表。

解决方案 »

  1.   

    -- 第一次看Eygle(盖国强)的书,
    -- 感触很深,Eygle是一个非常讲究实战的人,在实战的同时,结合理论技给读者术讲解的非常透彻、明了.......
    -- 我只是借 Eygle (大师) 之手,在这里卖弄技巧而已。
    -- 只望共同探讨、共同进步,别无它求!
      

  2.   

    学习了
    上次我们财务系统无缘无故丢失的数据就是L用FLASHBACK取回来的,
    可惜我没有找到错误原因,遗憾。。
      

  3.   

    才刚起步
    没机会接触egyle的书