如果你不小心把一個重要的數據庫表刪除了,那么請不要緊張、不要着急,因為Oracle Database 10g 中新增加了閃回表特性,它使得被刪除表的恢復過程如同執行幾條語句一樣簡單。讓我們來看該特性是如何工作的。
首先,讓我們查看當前模式中的表。
TNAME TABTYPE CLUSTERID
------------------------ ------- ----------
RECYCLETEST TABLE
現在,我們意外地刪除了該表:
SQL> drop table recycletest;
Table dropped.
現在讓我們來查看該表的狀態。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE
表 RECYCLETEST 已不存在,但是請注意出現新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發生的事情:被刪除的表 RECYCLETEST 並沒有完全消失,而是重命名為一個由系統定義的名稱。它存在於同一個表空間中,具有與原始表相同的結構。如果在該表上定義了索引或觸發器,則它們也被重命名,使用與表相同的命名規則。任何相關源(如過程)都失效;原始表的觸發器和索引被改為放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被刪除表的完整對象結構。
表及其相關對象被放置在一個稱為“回收站”的邏輯容器中,它類似於您 PC 機中的回收站。但是,對象並沒有從它們原先所在的表空間中刪除;它們仍然占用那里的空間。回收站只是一個列出被刪除對象目錄的邏輯結構。在 SQL*Plus 提示符處使用以下命令來查看其內容(您需要使用 SQL*Plus 10.1 來進行此操作):
SQL> show recyclebinORIGINAL NAME RECYCLEBIN NAME
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------------------ ------------------
RECYCLETEST BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 2004-02-16:21:13:31
結果顯示了表的原始名稱 RECYCLETEST,並顯示了回收站中的新名稱,該名稱與我們看到的刪除后所創建的新表名稱相同。(注意:確切的名稱可能因平台不同而不同。)為恢復該表,您所需要做的就是使用 FLASHBACK TABLE 命令:
SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;FLASHBACK COMPLETE.SQL> SELECT * FROM TAB;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------RECYCLETEST TABLE
瞧!表毫不費力地恢復了。
但是,如果你在刪除表的時候使用了PURGE關鍵字,那么表將會被徹底刪除不能再恢復。請看下例:
SQL> drop table log_dict_kind2 purge; Table dropped SQL> flashback table log_dict_kind2 to before drop; flashback table log_dict_kind2 to before drop ORA-38305: 對象不在回收站中 SQL>