說一說ORACLE FLASHBACK TABLE的一個有趣問題
我們知道,ORACLE 10G新增了FLASHBACK特性,其中FLASHBACK TABLE用來對誤刪的表進行修復(fù)。但是今天卻發(fā)現(xiàn)了FLASHBACK TABLE的一個有趣問題,請看下面慢慢道來:下面我用一個例子來說明我的遇到的有趣的問題,歡迎大家探討。
- SQL> CONNECT SYSDBA/***** AS SYSDBA
- 已連接。
- SQL> CREATE TABLE TEST (T VARCHAR2(10) ) ;
- 表已創(chuàng)建。
- SQL> DROP TABLE TEST;
- 表已刪除。
- SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
- FLASHBACK TABLE TEST TO BEFORE DROP
- *
- 第 1 行出現(xiàn)錯誤:
- ORA-38305: 對象不在回收站中
出現(xiàn)ORA-38305錯誤,起初我以為是回收站機制參數(shù)OFF引起的,Oracle10g起,引入了回收站的機制,將drop掉的數(shù)據(jù)表保存在回收站中。當(dāng)發(fā)現(xiàn)誤刪除的時候,可以通過回收站回收數(shù)據(jù)表?;厥照緳C制類似于我們在Windows系統(tǒng)上的回收站。在Windows中,當(dāng)我們選擇刪除一個文件時,本質(zhì)上并沒有將文件從硬盤上刪除,只是將文件以一種形式改名,這樣就能從回收站中看到。于是我查看了RECYCLEBIN參數(shù)。
奇怪的是回收站參數(shù)是開啟的,SQL> SHOW RECYCLEBIN; 也看不到刪除的表。這到底是咋回事呢?折騰了很久。后來修改了創(chuàng)建表的表空間,竟然一切都OK
- SQL> CREATE TABLE TEST(T VARCHAR2(10)) TABLESPACE USERS;
- 表已創(chuàng)建。
- 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;
- 未選定行
如果不指定創(chuàng)建表的表空間,那么它會使用默認的表空間SYSTEM,你可以通過SELECT TABLESPACE_NAME FROM USER_TABLES WHERE TABLE_NAME='TEST'查看。后來我有多次重復(fù)了這個實驗,結(jié)果都是如此,看來在表空間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下使用回收站機制,不知道ORACLE為什么有這限制。
關(guān)于Oracle數(shù)據(jù)庫的FLASHBACK TABLE的知識就介紹到這里,希望能對您有所幫助。
【編輯推薦】