大家在平時開發中,有時意外的刪除過表,可能就是直接重新創建該表。在oracle10g中,可以用Flashback drop恢復用一個被刪除(drop)了的對象,oracle自動將該對象放入回收站。Flashback drop恢復的原理也是利用oracle的回收站來恢復被刪除(drop)的對象。
回收站,是一個虛擬的容器,用于存放所有被刪除的對象。其實,對于一個對象的刪除,數據庫僅僅是簡單的重命名操作。
數據庫參數recyclebin設置為on.(即默認設置)。參數recyclebin為on,則表示把Drop的對象放入回收站。為off,則表示直接刪除對象而不放入回收站。
查看recyclebin值命令如:
SQL> show parameter bin;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
在系統或會話級別中修改參數recyclebin值的命令為:
SQL>alter system set recyclebin = on|off;
SQL>alter session set recyclebin = on|off;
查看回收站的相關信息視圖有:recyclebin/user_recyclebin/dba_recyclebin.
手動清除回收站的信息為:purge recyclebin(或purge table original_name);
刪除一張表而不想放入回收站的命令為:drop table table_name purge;
示例1:
1.查看用戶下回收站的信息,此時回收站為空
SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ ------------- ------
2.創建測試表tab_test,并為該表增加ind_test索引
SQL>createtabletab_testasselect*fromall_objects;
Tablecreated
SQL>createindexind_testontab_test(object_id);
Indexcreated
SQL> select count(*) from tab_test;
COUNT(*)
----------
40699
3。用drop命令刪除tab_test表
SQL>droptabletab_test;
Tabledropped
4。查看用戶回收站信息,此時會記錄刪除后的對象在回收站中的相關信息,此時還能正常操作回收站中的對象,但不能操作DDL/DML語句
SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ ------------- ------
BIN$a+iPOcq+QXiwUT8B3c3QoA==$0 IND_TEST INDEX
BIN$zFJjV8zFSlqbLecXbDeANQ==$0 TAB_TEST TABLE
SQL>selectcount(*)from"BIN$zFJjV8zFSlqbLecXbDeANQ==$0";
COUNT(*)
----------
40699
SQL>deletefrom"BIN$zFJjV8zFSlqbLecXbDeANQ==$0";
deletefrom"BIN$zFJjV8zFSlqbLecXbDeANQ==$0"
ORA-38301:無法對回收站中的對象執行DDL/DML
5.用flashback恢復表到刪除之前的狀態
SQL>flashbacktabletab_testtobeforedrop;
Done
SQL> select count(*) from tab_test;
COUNT(*)
----------
40699
6.恢復表的索引(此時表中的索引同時也被恢復了,只不過該索引還是保留回收站中的索引名稱)
SQL> select index_name from user_indexes where table_name = 'TAB_TEST';
INDEX_NAME
------------------------------
BIN$a+iPOcq+QXiwUT8B3c3QoA==$0
SQL> alter index "BIN$a+iPOcq+QXiwUT8B3c3QoA==$0" rename to ind_test;
Index altered
SQL> select index_name from user_indexes where table_name = 'TAB_TEST';
INDEX_NAME
------------------------------
IND_TEST
示例2:
1.查看用戶下回收站的信息,此時回收站為空
SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ ------------- ------
2.創建測試表test1,并輸入數據
SQL> create table test1(id number);
Table created
SQL> insert into test1 values(1);
1 row inserted
SQL> insert into test1 values(2);
1 row inserted
SQL> insert into test1 values(3);
1 row inserted
SQL> insert into test1 values(4);
1 row inserted
SQL> commit;
Commit complete
SQL> select count(*) from test1;
COUNT(*)
----------
4
3.刪除test1表,然后在重新創建test1表
SQL> drop table test1;
Table dropped
SQL> create table test1(id number);
Table created
SQL> insert into test1 values(1);
1 row inserted
SQL> commit;
Commit complete
SQL> select count(*) from test1;
COUNT(*)
----------
1
4.再次刪除test1表
SQL> drop table test1;
Table dropped
5.查詢回收站信息(此時回收站中有兩條test1表的數據)
SQL>select*fromuser_recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------ --------------------
BIN$Uk69X077TQWqQ0OQ3u1FdQ==$0 TEST1 TABLE
BIN$kpG5ZWdlRUi/jO6X0EYP+A==$0 TEST1 TABLE
5.用flashback恢復表到刪除之前的狀態
SQL> flashback table test1 to before drop;
Done
SQL> select count(*) from test1;
COUNT(*)
----------
1
此時查看恢復后的test1,發現恢復到最近一次的信息,因此可說明多次刪除后,在回收站中會存在多條與test1有關的數據,而用flashback table test1 to before drop命令恢復到的是test1表中最近一次刪除的信息
posted on 2010-08-04 20:40
xzc 閱讀(787)
評論(0) 編輯 收藏 所屬分類:
Oracle