與數據打交道,免不了會誤刪一些數據,以後還commit了,連回滾的機會都沒了,而更糟糕的是你又沒有備份,這種事終於在今天被我不幸的趕上了。。。oracle
惟一一點值得欣慰的是,我刪除表記錄的時候,時間不長,一天而已,而我用的刪除也是delete刪除,不是truncate刪除。spa
oracle已經考慮到咱們會出現這樣的錯誤,因此咱們仍是能夠經過語句找回咱們的數據。flash
若是咱們delete表的數據,咱們能夠經過如下步驟找回被刪除的數據:it
一、肯定刪除數據的時間,(若是實在記不清楚,只要在刪除數據以前的就行)table
二、找出被刪除數據的語句,select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss');容器
三、把刪除的數據從新插入原表,insert into 表名 (select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss'));object
注意:保證主鍵不重複。select
若是表結構沒有發生變化,咱們可使用閃回功能:權限
表閃回要求用戶必需要有flash any table權限
alter table 表名 enable row movement;im
接下來咱們執行這個操做
flashback table 表名 to timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss');
這下咱們知道delete數據瞭如何恢復。但若是咱們是drop一個表以後,還想要找回這個表呢,繼續操做:
因爲oracle在刪除表時,沒有直接清空表所佔的塊,oracle把這些已刪除的表的信息放到了一個虛擬容器「回收站」中,
而只是對該表的數據塊作了能夠被覆寫的標誌,因此在塊未被從新使用前還能夠恢復。
可能查詢這個「回收站」或者查詢user_table視圖來查找已被刪除的表:
select table_name,dropped from user_tables
select object_name,original_name,type,droptime from user_recyclebin
在以上信息中,表名都是被重命名過的,字段table_name或者object_name就是刪除後在回收站中的存放表名
若是還能記住表名,則能夠用下面語句直接恢復:
flashback table 原表名 to before drop
若是記不住了,也能夠直接使用回收站的表名進行恢復,而後再重命名,參照如下語句:
flashback table "回收站中的表名(如:Bin$DSbdfd4rdfdfdfegdfsf==$0)" to before drop rename to 新表名
切記:若是你使用truncate 刪除數據了,而你又沒有備份,那這個就很不幸了!!!