oracle常見數據文件恢復方法

1、基於linux操作系統文件恢復

     條件:1、誤強制刪除linux下的數據文件(rm -rf)。2、未重啓數據庫或操作系統。3、數據庫是歸檔模式

     恢復原理:句柄恢復文件--因爲我們的操作系統是linux,當數據文件從操作系統級別被rm掉,但之前打開該文件的進程仍然持有相應的文件句柄,所以指向的文件仍然可以讀寫,並且該文件的文件描述符可以從/proc目錄中獲得。

                       若重啓了數據庫或者操作系統,那麼句柄就會消失,可以通過掃描磁盤進行文件恢復

     恢復步驟:

       1、檢查dbwr的進程PID: [oracle@dg2 oracle]$ps -ef|grep dbw0|grep -v grep         --目錄名是進程PID,fd表示文件描述符。         2、通過進程id9946找到對應的目錄:[oracle@dg2 oracle]$cd /proc/9964/fd

       3、找到被刪除的文件:[oracle@dg2 oracle]$ ls -l(會有一個delete的標誌)

       4、直接cp 刪除的句柄文件名回原位置:[oracle@dg2 oracle]$ cp  句柄文件名  /u01/app/oradata/dropdatafile.dbf

2、利用閃回,基於時間戳或者SCN恢復數據文件(drop 或者 delete

   條件:1、在刪除數據後還沒做大量的操作,數據沒有被覆蓋。2、9i之後的版本。3、不考慮全庫備份和利用歸檔日誌

              4、閃回已經打開:alter database flashback on

   恢復原理:利用閃回功能恢復數據

   恢復步驟:(時間戳

       1、確定刪除數據的時間(在刪除數據之前的時間就行,不過最好是刪除數據的時間點)。 
       2、用語句找出刪除的數據  (select * from 表名 as of timestamp sysdate-30/1440;  30分鐘內的語句)。

select * from 表名 as of timestamp to_timestamp('2013-05-29 15:29:00','yyyy-mm-dd hh24:mi:ss');  (如果不是,則繼續縮小範圍)
       3、把刪除的數據重新插入原表。(insert into 表名 (select * from 表名 as of timestamp sysdate-30/1440 );)

       4、SQL>flashback database to timestamp to_timestamp('2007-2-12 12:00:00','yyyy-mm-dd hh24:mi:ss');

   恢復步驟:(scn

       1、獲得當前數據庫的scn號,查詢到的scn號:  (select current_scn from v$database;)

       2、查詢當前scn號之前的scn: select * from 表名 as of scn 1499220;

       3、恢復刪除且已提交的數據:flashback table 用戶.表名 to scn 1499220;  (若是sys用戶,表需帶上用戶名)

        如果flash出現錯誤。可以嘗試執行 alter table 表名 enable row movement,使用後改成disable

       4、如果是表被drop掉:

              可以先查詢刪除數據:select * from recyclebin order by droptime desc

              直接閃回表:flashback table '需要恢復的表名' to before drop

建議:建議使用AS OF SCN的方式執行Flashback Query。如需要對多個相互有主外鍵約束的表進行恢復時,如果使用AS OF TIMESTAMP的方式,可能會由於時間點不統一的緣故造成數據選擇或插入失敗,通過AS OF SCN方式則能夠確保記錄處理的時間點一致。

總結:
flash機制保證了數據安全操作,但同時會有另外一個問題,就是空間佔用,由於以上機制的運行,使用drop一個表或者delete數據後,空間不會自動回收,對於一些確定不使用的表,刪除時要同時回收空間,可以有以下2種方式:

  1、採用truncate方式進行截斷。(但不能進行數據回恢復了)

  2、在drop時加上purge選項:drop table 表名 purge

  3、也可以通過刪除recyclebin區域來永久性刪除表 ,

  原始刪除表:drop table emp cascade constraints   purge table emp;     

   刪除當前用戶的回收站:purge recyclebin;       刪除全體用戶在回收站的數據::purge dba_recyclebin

 

注:1、執行閃回時:報如下錯誤  ORA-00604: 遞歸 SQL 級別 1 出現錯誤 ORA-25153: 臨時表空間爲空  重建零時表空間即可(一般問題是沒有臨時表空間)   臨時表空間的作用見:

alter tablespace temp add tempfile 'D:\app\Administrator\oradata\WAREHOUSE\CONTROLFILE\temp01.dbf' size 20M autoextend off;

   

 

 

 

 

 

 

 

 

 

 

 

 

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