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;