oracle閃回特性之flashback drop

9i開始,Oracle提供了閃回(FLASHBACK)功能。Oracle閃回功能支持查看過去某個狀態的數據,回退誤刪除的數據等等。使用閃回操作要比傳統的恢復操作更加的快捷。但是閃回不能恢復介質錯誤,只能恢復人爲造成的誤操作。

oracle 提供了三種級別的閃回操作,在這主要描述flashback drop。

Flashback  drop

  Oracle10g以後,drop不會將表直接刪除掉,而是將表進行重命名,也就是說你使用了droporacle只是將表重命名,但是表仍然在原地保存,可以在oracle的回收站中查到相關的信息。下面是一個實驗:

先來創建一個表

SQL>create table test(id integer,value varchar2(200));

SQL>insert into test values(1,'flash drop test');               

SQL>select * from test;                                                  

        ID VALUE                                                                    

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

         1 flash drop test                                                        

可以使用以下語句查看被刪除的對象                                                 

SQL>select object_name,operation from user_recyclebin

where original_name='TEST';                                                            

OBJECT_NAME                   OPERATION                                     

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

BIN$pry84fToRMGMUmgRxFqrUQ==$0 DROP                      

我們可以來看看上面這個對象中的內容                                             

SQL> select * from "BIN$pry84fToRMGMUmgRxFqrUQ==$0";  

        ID VALUE                                      

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

         1 flash drop test                            

 

通過以上語句我們可以看到oracle並沒有刪除掉表,而是對錶進行重命名。

現在我們來恢復數據

 

SQL>flashback table test to before drop;

 

閃回完成。

 

SQL>select * from test;

        ID VALUE

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

         1 flash drop test

 

Oracledrop掉數據使用了回收站,那來看看回收站

SQL>show parameter recyclebin

 

NAME                                 TYPE        VALUE

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

recyclebin                           string      on

recyclebin這個參數表示oracle回收站是打開的,也就是說oracle可以使用flashbackdrop

要查詢回收站的信息可以使用以下幾個試圖

select *from  RECYCLEBIN;

select *from dba_recyclebin;

select * from user_recyclebin;等價於recyclebin

要清理回收站中的內容,可以通過以下方式

drop table tablename purge;

PURGE{TABLE <table_name>|INDEX <index_name>}

清理“回收站”中指定的表或索引

PURGETABLESPACE <ts_name> [USER <user_name>]

清理“回收站”中存儲在指定表空間的上的對象(或指定用戶的對象)

PURGE [USER_|DBA_]RECYCLEBIN

清理“回收站”中當前用戶或者所有數據庫內的對象。

滿足下面任何一條,被drop掉的表,都不能被閃回了:

drop掉的表不能存儲在system表空間上;

drop掉的表不能存儲在數據字典管理的表空間上;

drop掉的表還存儲在“回收站”中,沒有被purge掉。

比如說下面就無法閃回:

SQL>drop table test purge;

 

表已刪除。

 

SQL>flashback table test to before drop;

flashbacktable test to before drop

*

1 行出現錯誤:

ORA-38305:對象不在回收站中

下面我們再來做一個實驗:

SQL>create table test(id integer ,value varchar2(100));

 

表已創建。

 

SQL>insert into test values(1,'flashback drop 1');

 

已創建 1 行。

 

SQL>commit;

 

SQL>drop table test;

 

表已刪除。

 

SQL>create table test(id integer ,value varchar2(100));

 

SQL>insert into test values(2,'flashback drop 2');

 

已創建 1 行。

 

SQL>commit;

 

提交完成。

 

SQL>drop table test;

 

表已刪除。

SQL>select object_name,operation from user_recyclebin where original_name='TEST

';

 

OBJECT_NAME                    OPERATION

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

BIN$lACU0aQKTQyHGrSufKII7w==$0DROP

BIN$ysxSAgtjQuuELE6SZXxcUA==$0DROP

 

SQL>flashback table test to before drop;

 

閃回完成。

 

SQL>select * from test;

 

        ID VALUE

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

         2 flashback drop 2

那我們如何恢復到id1的那個狀態,可以使用以下方法,重命名錶

SQL>flashback table test to before drop rename to new_test;

 

閃回完成。

 

SQL>select * from new_test;

 

        ID VALUE

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

         1 flashback drop 1

下面是網上做的一些總結

    1.表的刪除被映射爲將表的重命名,然後將其置於回收站

    2.表的索引,觸發器,授權閃回後將不受到影響.索引,觸發器名字可以根據需要進行更改回原來名稱

    3.對於約束,如果是外鍵約束,表刪除之後將不可恢復,其餘的約束不受影響

    4.如果要查詢回收站中的對象,建議將對象名使用雙引號括起來

    5.閃回的實質並不能撤銷已提交的事務,而是構造倒退原有事務影響的另一個事務

    6.對於已經刪除的表如果在所在的表空間新增對象由於空間不足的壓力而被重用將導致閃回失敗

   7.對於表空間不足時,系統會自動清除回收站中最老的對象,以滿足當前需求,即採用FIFO原則

    8.閃回表的常用方法

        flashback table tbname to before drop ;

        flashback table tbname to before droprename to newtbname;

        第二條語句用於被刪除的表名已經被再次重用,故閃回之前必須將其改名爲新表名,schema不變化

   9.如回收站中存在兩個相同的原表名,則閃回時總是閃回最近的版本,如果閃回特定的表,需要指定

        該表在回收站中的名稱。如

        flashback table"BIN$k1zC3yEiwZvgQAB/AQBRVw==$0" to before drop;

    10.flashback drop 不能閃回truncate命令截斷的表,而是隻能恢復drop 之後的表

    11.flashback drop 不能閃回drop user scott cascade刪除方案的操作,此只能用flashback database

    12.在system表空間中存儲的表無法啓用flashback drop,且這些表會被立即刪除

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章