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

          大家在平時開發中,有時意外的刪除過表,可能就是直接重新創建該表。在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 閱讀(798) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 昌邑市| 拜城县| 探索| 大埔区| 交城县| 古蔺县| 勐海县| 绵阳市| 界首市| 砚山县| 丰城市| 衡阳县| 遂昌县| 鄯善县| 平定县| 南靖县| 芦溪县| 松滋市| 南康市| 辽阳市| 黑河市| 汽车| 保亭| 新龙县| 曲靖市| 会同县| 安平县| 泸西县| 广灵县| 梓潼县| 白沙| 通河县| 洪江市| 尼玛县| 温州市| 桐梓县| 阳原县| 安溪县| 浏阳市| 荆门市| 柳州市|