從9i開始,Oracle提供了閃回(FLASHBACK)功能。Oracle閃回功能支持查看過去某個狀態的數據,回退誤刪除的數據等等。使用閃回操作要比傳統的恢復操作更加的快捷。但是閃回不能恢復介質錯誤,只能恢復人爲造成的誤操作。
oracle 提供了三種級別的閃回操作,在這主要描述flashback drop。
Flashback drop
在Oracle10g以後,drop不會將表直接刪除掉,而是將表進行重命名,也就是說你使用了drop,oracle只是將表重命名,但是表仍然在原地保存,可以在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
Oracle在drop掉數據使用了回收站,那來看看回收站
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
那我們如何恢復到id爲1的那個狀態,可以使用以下方法,重命名錶
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,且這些表會被立即刪除