回收站介紹:實現閃回刪除功能,需要使用oracle回收站。回收站是所有被刪除對象及其相依對象的邏輯存儲容器,例如當一個表被drop時,該表及其相依對象並不會馬上被數據庫徹底刪除,而是被保存到回收站中。
回收站將用戶執行的drop操作記錄在一個系統表中,也就是將被刪除的對象寫到一個數據字典中。如果確定不再需要該對戲那個,可以使用purge命令對回收站進行清空。被刪除的對象的名稱可能相同。爲了確保添加到回收站中的對象的名稱都是唯一的,系統會對這些保存到回收站中的對象進行重命名,命名格式如下:
BIN$globalUID$version
其中,BIN表示RecycleBIN,globalUID是一個全局唯一的、24個字符長的標識對象,該標識與原對象名沒有任何關係,$version表示數據庫分配的版本號。
接下來演示一個示例:
首先創建一個表tb_temptest,並插入兩條數據:
SQL> create table tb_temptest(id number)
2 /
表已創建。
SQL> insert into tb_temptest select 1 from dual union select 2 from dual
已創建2行。
SQL> commit;
提交完成。
查看剛插入的數據:
SQL> select * from tb_temptest;
ID
----------
1
2
SQL>
執行drop刪除表:
SQL> drop table tb_temptest;
表已刪除。
查看回收站是否保存了剛纔刪除的表
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TB_TEMPTEST BIN$/xHQTJWwTr20WgwHd65BUQ==$0 TABLE 2013-01-26:20:50:32
從上面可以看出剛纔刪除的表被存儲在回收站中了(注意sys用戶和system用戶除外,只有普通用戶操作才能被保存到回收站中)
執行閃回刪除,相應的數據也恢復回來了:
SQL> flashback table tb_temptest to before drop;
閃回完成。
SQL> show recyclebin;
SQL> select * from tb_temptest;
ID
----------
1
2
SQL>
如果在執行閃回操作時數據庫中已經重建了相同的表名,這時需要對閃回的表進行重命名:
SQL> flashback table tb_temptest to before drop rename to newtablename;
閃回時也可以使用RECYCLEBIN NAME進行恢復,(但要加雙引號)
我們再次drop掉表tb_temptest,並用RECYCLEBIN NAME進行閃回:
SQL> drop table tb_temptest;
表已刪除。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TB_TEMPTEST BIN$EjDM+LpCQ22xKBt22KnjXQ==$0 TABLE 2013-01-26:21:08:12
SQL> flashback table "BIN$EjDM+LpCQ22xKBt22KnjXQ==$0" to before drop;
閃回完成。
SQL> show recyclebin;
SQL> select * from tb_temptest;
ID
----------
1
2
SQL>