隨筆-314  評論-209  文章-0  trackbacks-0

          大家在平時開發(fā)中,有時意外的刪除過表,可能就是直接重新創(chuàng)建該表。在oracle10g中,可以用Flashback drop恢復用一個被刪除(drop)了的對象,oracle自動將該對象放入回收站。Flashback drop恢復的原理也是利用oracle的回收站來恢復被刪除(drop)的對象。

          回收站,是一個虛擬的容器,用于存放所有被刪除的對象。其實,對于一個對象的刪除,數(shù)據(jù)庫僅僅是簡單的重命名操作。

          數(shù)據(jù)庫參數(shù)recyclebin設置為on.(即默認設置)。參數(shù)recyclebin為on,則表示把Drop的對象放入回收站。為off,則表示直接刪除對象而不放入回收站。

          查看recyclebin值命令如:

          SQL> show parameter bin;

          NAME                         TYPE       VALUE

          ------------------------------------ ----------- ------------------------------

          recyclebin                        string     on

          在系統(tǒng)或會話級別中修改參數(shù)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.
          創(chuàng)建測試表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:無法對回收站中的對象執(zhí)行DDL/DML

          5.用flashback恢復表到刪除之前的狀態(tài)
          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.
          創(chuàng)建測試表test1,并輸入數(shù)據(jù)
          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表,然后在重新創(chuàng)建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表的數(shù)據(jù))

          SQL>select*fromuser_recyclebin;

          OBJECT_NAME                   ORIGINAL_NAME  TYPE                     
          ------------------------------ --------------------
          BIN$Uk69X077TQWqQ0OQ3u1FdQ==$0 TEST1         TABLE                   
          BIN$kpG5ZWdlRUi/jO6X0EYP+A==$0 TEST1         TABLE 

          5.用flashback恢復表到刪除之前的狀態(tài)

          SQL> flashback table test1 to before drop;

          Done

          SQL> select count(*) from test1;

           COUNT(*)

          ----------

                  1

          此時查看恢復后的test1,發(fā)現(xiàn)恢復到最近一次的信息,因此可說明多次刪除后,在回收站中會存在多條與test1有關的數(shù)據(jù),而用flashback table test1 to before drop命令恢復到的是test1表中最近一次刪除的信息


          posted on 2010-08-04 20:40 xzc 閱讀(792) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 兰西县| 明光市| 商南县| 舟山市| 靖江市| 阿瓦提县| 武隆县| 阳城县| 肥城市| 孝义市| 晋中市| 嵊州市| 商水县| 宿州市| 崇义县| 虎林市| 固安县| 太原市| 会泽县| 苍山县| 南宫市| 英吉沙县| 鲁甸县| 香格里拉县| 页游| 汉源县| 凤凰县| 武强县| 嵩明县| 务川| 浙江省| 千阳县| 长子县| 荆州市| 霍州市| 洪洞县| 泰宁县| 全椒县| 建湖县| 万载县| 溧水县|