Oracle 10g開始提供了類似windows系統的資源回收筒功能,使用者在刪除表的時候會不是直接刪除,而是移動到資源回收筒中,如果需要從資源回收筒中取回原來的表,可以使用閃回刪除表的特性,迅速的找回被刪除的表,而不需要從備份中匯入原有的表!但這個資源回收筒功能也是有前提的,不是在任何情況下都可以使用閃回刪除表特性,總結下,在10g中,下面幾種情境表不能flashback刪除,至於11g是否有改進,感興趣的朋友可以參照本文的方法進行測試下!順帶說下,資源回收筒採取fifo,先進先出的機制!例如在資源回收筒有兩張同樣名稱的表,閃回刪除的時候根據刪除時間的先後順序來覺得先閃回哪張表,因而閃回刪除表命令提供了rename to選項;
1:資源回收筒功能未開啟(這個就不用測試了)
2:表的儲存資料表空間不能為system
3: 表被刪除的時候不能帶purge參數
4:存在空間壓力的時候
5:表上面啟用了細粒度審計
6:表啟用了VPD
一:測試資料表空間儲存為system的閃回刪除
1.1 建立測試使用者,並賦予相應的許可權,開啟資料庫的資源回收筒功能
- [oracle@dg53 ~]$ sqlplus /nolog
- SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 16 16:48:44 2012
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
-
- SQL> conn /as sysdba
- Connected.
-
- SQL> create user test identified by "123456" default tablespace users account unlock;
- User created.
-
- SQL> grant resource,connect to test;
- Grant succeeded.
-
- SQL> show parameter recyclebin;
-
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- recyclebin string on
1.2 使用test使用者建立2張表,一張儲存在system資料表空間
- Connected.
- SQL> create table drop_1 (a number) tablespace system;
- Table created.
-
- SQL> insert into drop_1 values (1);
- 1 row created.
-
- SQL> commit;
- Commit complete.
-
- SQL> create table drop_2 as select * from drop_1;
- Table created.
-
- SQL> select * from tab;
-
- TNAME TABTYPE CLUSTERID
- ------------------------------ ------- ----------
- DROP_1 TABLE
- DROP_2 TABLE
1.3 分別刪除2張表,不帶purge參數,查看資源回收筒只存在drop_2表,該表的儲存資料表空間為users,由此證明資料表空間儲存為system的表是不可以被閃回刪除的
- SQL> drop table drop_1;
- Table dropped.
-
- SQL> drop table drop_2;
- Table dropped.
-
- SQL> show recyclebin;
- ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
- ---------------- ------------------------------ ------------ -------------------
- DROP_2 BIN$uRD2vL3ZVNjgQKjANQEaNg==$0 TABLE 2012-02-16:16:53:36
-
- SQL> select object_name,original_name from user_recyclebin;
-
- OBJECT_NAME ORIGINAL_NAME
- ------------------------------ --------------------------------
- BIN$uRD2vL3ZVNjgQKjANQEaNg==$0 DROP_2
-
- SQL> flashback table drop_2 to before drop;
- Flashback complete.
1.4 測試使用sys使用者刪除drop_2表,是否可以成功閃回刪除
- SQL> conn /as sysdba
- Connected.
- SQL> show user;
- USER is "SYS"
- SQL> drop table test.drop_2;
- Table dropped.
-
- SQL> conn test/123456
- Connected.
- SQL> select * from tab;
-
- TNAME TABTYPE CLUSTERID
- ------------------------------ ------- ----------
- BIN$uRImQA9UYD7gQKjANQEdrg==$0 TABLE
-
- SQL> show recyclebin;
- ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
- ---------------- ------------------------------ ------------ -------------------
- DROP_2 BIN$uRImQA9UYD7gQKjANQEdrg==$0 TABLE 2012-02-16:17:06:54
-
- SQL> flashback table drop_2 to before drop;
- Flashback complete