Oracle恢復誤刪除的資料檔案

dbasdk發表於2015-01-22
實驗環境:
    CentOS 6.4
    Oracle 11.2.0.3.0

1.模擬誤刪除了Oracle的資料檔案
下面是Oracle的資料檔案目錄


刪除所有的檔案.
[oracle@master orcl]$ rm -rf *
[oracle@master orcl]$ ls
[oracle@master orcl]$ 

這個時候千萬不要關閉資料庫例項

2.恢復資料檔案
首先找到dbwn的程式號(PID),可以看到pid是3030
[oracle@master orcl]$ ps -ef | grep ora_dbw | grep -v grep
oracle    3030     1  0 09:14 ?        00:00:01 ora_dbw0_orcl

進入這個程式的目錄
[root@master fd]# cd /proc/3030/fd


可以看到相關的檔案都已經刪除

現在只需要將刪除的檔案複製回原位置即可.
如cp 256 /home/oracle/app/oracle/oradata/orcl/control01.ctl

但是檔案數量較大,可以使用AWK拼接命令
[root@master fd]# ll | awk '/deleted/{print "cp "$9" "$11}' > /tmp/test.sh
[root@master fd]# source /tmp/test.sh

3.同理,恢復日誌檔案
[root@master fd]# ps -ef | grep ora_lgwr | grep -v grep
oracle    3032     1  0 09:14 ?        00:00:09 ora_lgwr_orcl

進入lgwr程式的目錄
[root@master fd]# cd /proc/3032/fd


恢復redolog
[root@master fd]# ll | awk '/deleted/{print "cp "$9" "$11}' | grep redo > /tmp/test.sh
[root@master fd]# source /tmp/test.sh

其中/tmp/test.sh的內容如下
cp 258 /home/oracle/app/oracle/oradata/orcl/redo01.log
cp 259 /home/oracle/app/oracle/oradata/orcl/redo02.log
cp 260 /home/oracle/app/oracle/oradata/orcl/redo03.log


4.重啟資料庫例項

檔案恢復之後,停止資料庫例項,重新設定檔案的屬主和屬組(一般使用root恢復,需要重新設定為原使用者)
重啟資料庫例項,發現控制檔案不一致,用其他控制檔案覆蓋即可(多路複用控制檔案的好處).
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup open;
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size    2232472 bytes
Variable Size  478154600 bytes
Database Buffers  297795584 bytes
Redo Buffers    6815744 bytes
ORA-00214: control file
'/home/oracle/app/oracle/fast_recovery_area/orcl/control02.ctl' version 1946
inconsistent with file '/home/oracle/app/oracle/oradata/orcl/control01.ctl'
version 1939


總結:
    1.在誤刪除發生的時候,千萬不要停止資料庫例項.只要程式還握有檔案控制程式碼,還是有可能恢復的.
    2.直接查詢lgwr的程式比查詢dbwn要好.因為lgwr除了握有資料檔案的控制程式碼還握有日誌檔案的控制程式碼.
    3.經過實驗,MySQL資料庫不能使用這種方式恢復.因為MySQL程式不會握有所有檔案的控制程式碼,即使使用這種方式恢復了部分檔案,也不能啟動資料庫例項.

參考:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1410310/,如需轉載,請註明出處,否則將追究法律責任。

相關文章