ORACLE 10G新增了FLASHBACK特性,其中FLASHBACK TABLE用來對誤刪的表進行修複。
SQL> CONNECT SYSDBA/***** AS SYSDBA
已串連。
SQL> CREATE TABLE TEST (T VARCHAR2(10) ) ;
表已建立。
SQL> DROP TABLE TEST;
表已刪除。
SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
FLASHBACK TABLE TEST TO BEFORE DROP
*
第 1 行出現錯誤:
ORA-38305: 對象不在資源回收筒中
出現ORA-38305錯誤,起初我以為是資源回收筒機制參數OFF引起的,Oracle10g起,引入了資源回收筒的機制,將drop掉的資料表儲存在資源回收筒中。當發現誤刪除的時候,可以通過資源回收筒回收資料表。資源回收筒機制類似於我們在Windows系統上的資源回收筒。在Windows中,當我們選擇刪除一個檔案時,本質上並沒有將檔案從硬碟上刪除,只是將檔案以一種形式改名,這樣就能從資源回收筒中看到。於是我查看了RECYCLEBIN參數
奇怪的是資源回收筒參數是開啟的,SQL> SHOW RECYCLEBIN; 也看不到刪除的表。這到底是咋回事呢?折騰了很久。後來修改了建立表的資料表空間,竟然一切都OK
SQL> CREATE TABLE TEST(T VARCHAR2(
10)) TABLESPACE USERS;
表已建立。
SQL> DROP TABLE TEST;
表已刪除。
SQL> SHOW RECYCLEBIN;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST BIN$gVtRcd2NTqihW6yM4vs0Hw==$0 TABLE 2011-07-24:12:40:42
SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
閃回完成。
SQL> SELECT * FROM TEST;
未選定行
如果不指定建立表的資料表空間,那麼它會使用預設的資料表空間SYSTEM,你可以通過SELECT
TABLESPACE_NAME FROM USER_TABLES WHERE TABLE_NAME='TEST'查看。後來我有多次重複了這個實驗,結果都是如此,在資料表空間SYSTEM下是無法使用FLASHBACK TABLE特性的
官方文檔解釋:
You cannot 'flashback table to before drop' a table which has been created in the SYSTEM tablespace. The table is sent to the recyclebin only
if it existed in some other tablespace other than SYSTEM tablespace and that tablespace must be locally managed.
ORACLE限制了在資料表空間SYSTEM下使用資源回收筒機制,這也是為什麼不推薦用SYS使用者建立資料庫物件。
原文連結:http://www.cnblogs.com/kerrycode/archive/2011/07/24/2115332.html