關於oracle誤刪數據的恢復

  與數據打交道,免不了會誤刪一些數據,以後還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 刪除數據了,而你又沒有備份,那這個就很不幸了!!!

相關文章
相關標籤/搜索