隨筆-314  評(píng)論-209  文章-0  trackbacks-0

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

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

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

          查看recyclebin值命令如:

          SQL> show parameter bin;

          NAME                         TYPE       VALUE

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

          recyclebin                        string     on

          在系統(tǒng)或會(huì)話級(jí)別中修改參數(shù)recyclebin值的命令為:

          SQL>alter system set recyclebin = on|off;

          SQL>alter session set recyclebin = on|off;

          查看回收站的相關(guān)信息視圖有:recyclebin/user_recyclebin/dba_recyclebin.

          手動(dòng)清除回收站的信息為:purge recyclebin(或purge table original_name);

          刪除一張表而不想放入回收站的命令為:drop table table_name purge;

          示例1:

          1.查看用戶下回收站的信息,此時(shí)回收站為空

          SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;
          OBJECT_NAME                   ORIGINAL_NAME TYPE           
          ------------------------------ ------------- ------
          2.
          創(chuàng)建測(cè)試表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。查看用戶回收站信息,此時(shí)會(huì)記錄刪除后的對(duì)象在回收站中的相關(guān)信息,此時(shí)還能正常操作回收站中的對(duì)象,但不能操作DDL/DML語(yǔ)句
          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:無(wú)法對(duì)回收站中的對(duì)象執(zhí)行DDL/DML

          5.用flashback恢復(fù)表到刪除之前的狀態(tài)
          SQL>flashbacktabletab_testtobeforedrop;
          Done

          SQL> select count(*) from tab_test;

           COUNT(*)

          ----------

              40699

          6.恢復(fù)表的索引(此時(shí)表中的索引同時(shí)也被恢復(fù)了,只不過(guò)該索引還是保留回收站中的索引名稱)

          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.查看用戶下回收站的信息,此時(shí)回收站為空

          SQL>selectOBJECT_NAME,ORIGINAL_NAME,TYPEfromuser_recyclebin;
          OBJECT_NAME                   ORIGINAL_NAME TYPE           
          ------------------------------ ------------- ------
          2.
          創(chuàng)建測(cè)試表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.查詢回收站信息(此時(shí)回收站中有兩條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恢復(fù)表到刪除之前的狀態(tài)

          SQL> flashback table test1 to before drop;

          Done

          SQL> select count(*) from test1;

           COUNT(*)

          ----------

                  1

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


          posted on 2010-08-04 20:40 xzc 閱讀(798) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 曲麻莱县| 大姚县| 额济纳旗| 青海省| 深圳市| 镶黄旗| 东乡县| 威远县| 盘山县| 朝阳县| 栾川县| 沈丘县| 城市| 门源| 保德县| 朝阳县| 军事| 石林| 双柏县| 恩施市| 张家港市| 建宁县| 家居| 名山县| 三穗县| 灵宝市| 北宁市| 玉龙| 玉山县| 马边| 福鼎市| 泸西县| 灵寿县| 获嘉县| 措勤县| 辽中县| 益阳市| 织金县| 基隆市| 饶阳县| 东海县|