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

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

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

          數(shù)據(jù)庫參數(shù)recyclebin設(shè)置為on.(即默認(rèn)設(shè)置)。參數(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;

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

          手動清除回收站的信息為: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)建測試表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í)會記錄刪除后的對象在回收站中的相關(guān)信息,此時(shí)還能正常操作回收站中的對象,但不能操作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恢復(fù)表到刪除之前的狀態(tài)
          SQL>flashbacktabletab_testtobeforedrop;
          Done

          SQL> select count(*) from tab_test;

           COUNT(*)

          ----------

              40699

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

          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)建測試表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ù)到最近一次的信息,因此可說明多次刪除后,在回收站中會存在多條與test1有關(guān)的數(shù)據(jù),而用flashback table test1 to before drop命令恢復(fù)到的是test1表中最近一次刪除的信息


          posted on 2010-08-04 20:40 xzc 閱讀(792) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 石屏县| 新田县| 蓝山县| 沙坪坝区| 平江县| 师宗县| 财经| 抚松县| 宿州市| 思茅市| 华蓥市| 深泽县| 临沭县| 福贡县| 达州市| 望城县| 石棉县| 界首市| 高邑县| 武夷山市| 绥滨县| 太和县| 山阳县| 济源市| 望江县| 伊金霍洛旗| 民权县| 康平县| 洛南县| 杭锦旗| 宜州市| 体育| 郑州市| 香港| 嫩江县| 读书| 外汇| 治多县| 城固县| 泸水县| 临高县|