10g的新功能FlashBACK可以恢復刪除的表,但是在索引上還有一些問題,尤其是全文索引。 對于表而言,FLASHBACK可以從回收站中將表恢復,對于索引也是可以恢復的,但是名稱已經不是刪除之前的名稱了:SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(4000));表已創建。SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);表已更改。SQL> SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES WHERE TABLE_NAME = 'T';INDEX_NAME INDEX_TYPE------------------------------ ---------------------------PK_T NORMALSQL> DROP TABLE T;表已刪除。SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE FROM RECYCLEBIN;OBJECT_NAME ORIGINAL_NAME TYPE------------------------------ --------------------------- ------------BIN$NvibMDOJQFG+eWVDvmWAxQ==$0 PK_T INDEXBIN$9bC8RcWpTay86d0+hHg1mQ==$0 T TABLESQL> FLASHBACK TABLE T TO BEFORE DROP;閃回完成。SQL> SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES WHERE TABLE_NAME = 'T';INDEX_NAME INDEX_TYPE------------------------------ ---------------------------BIN$NvibMDOJQFG+eWVDvmWAxQ==$0 NORMAL 從上面的結果可以看到,索引雖然恢復了,但是已經改變了名稱,這個名稱就是索引被放到回收站時的名稱。 希奇的是,Oracle明明已經記錄了回收站中對象對應的原始名稱,為什么沒有順便將索引的名稱恢復一下呢。 不過雖然Oracle沒有做,自己手工操作也很方便,上面的RECYCLEBIN視圖中已經可以看到回收站中索引的原始名稱,通過ALTER INDEX RENAME就可以將索引名稱恢復:SQL> ALTER INDEX "BIN$NvibMDOJQFG+eWVDvmWAxQ==$0" RENAME TO PK_T;索引已更改。SQL> SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES WHERE TABLE_NAME = 'T';INDEX_NAME INDEX_TYPE------------------------------ ---------------------------PK_T NORMAL 普通索引可以這樣恢復,對于全文索引就沒有這么幸運了:SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT;索引已創建。SQL> SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES WHERE TABLE_NAME = 'T';INDEX_NAME INDEX_TYPE------------------------------ ---------------------------PK_T NORMALIND_T_DOCS DOMAINSQL> DROP TABLE T;表已刪除。SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE FROM RECYCLEBIN;OBJECT_NAME ORIGINAL_NAME TYPE------------------------------ --------------------------- ------------BIN$LVtdDYtrQ7aJaFkZwDePOg==$0 PK_T INDEXBIN$5EnG2Lz8Sh+4dFbycIf+WA==$0 T TABLE 從這里已經可以看到了,回收站中根本沒有全文索引的記錄,而且,全文索引的那些輔助表也沒有包含進來,從這一點上看,就注定了全文索引是沒有辦法恢復的:SQL> FLASHBACK TABLE T TO BEFORE DROP;閃回完成。SQL> SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES WHERE TABLE_NAME = 'T';INDEX_NAME INDEX_TYPE------------------------------ ---------------------------BIN$LVtdDYtrQ7aJaFkZwDePOg==$0 NORMAL 果然,表進行了閃回操作后,全文索引信息丟失了。不過好在全文索引不會包含要害性信息,就是索引丟失也是可以重建的。不過Oracle的文檔并沒有提到全文索引會丟失的事實,只是提到參考約束不會恢復。 看來FLASHBACK TABLE值得改進的功能還有很多,不知道11g的時候是否把全文索引考慮進去。