前幾天提到的一則誤删除案例:
<a href="http://www.eygle.com/archives/2011/12/oracle_lsof_recovery_database.html">http://www.eygle.com/archives/2011/12/oracle_lsof_recovery_database.html</a>
Kamus 寫了一篇詳細步驟,轉載供參考:
<a href="http://www.dbform.com/html/2011/1761.html">http://www.dbform.com/html/2011/1761.html</a>
今天有客戶的資料庫意外被删除了整個目錄中的資料檔案,作業系統級别的删除,然而幸運的是這個資料庫沒有崩潰,仍然處于open狀态的時候,客戶就發現了問題,求助到我們,最終完整地恢複了所有資料檔案。
在Linux下大緻重新示範一下恢複的過程,恢複的步驟與資料庫版本沒有太大關系,與作業系統的不同會有所不同。
1. 在資料庫open的時候,直接删除users表空間中的資料檔案。
2. 嘗試在users表空間中建立表,開始報錯。
在告警日志中,同樣也可以看到類似資訊。
3. 檢查dbwr的程序PID
4. dbwr會打開所有資料檔案的句柄。在proc目錄中可以查到,目錄名是程序PID,fd表示檔案描述符。
注意其中"/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf (deleted)"字樣,表示該檔案已經被删除,如果是Solaris作業系統,ls指令不會有如此清晰的顯示,為了在Solaris系統中确認哪個句柄對應哪個檔案,則需要使用lsof程式。
5. 直接cp該句柄檔案名回原位置。
6. 進行資料檔案recover
完成資料檔案恢複。
恢複的原理是,在Linux作業系統中,如果檔案從作業系統級别被rm掉,之前打開該檔案的程序仍然持有相應的檔案句柄,所指向的檔案仍然可以讀寫,并且該檔案的檔案描述符可以從/proc目錄中獲得。但是要注意的是,此時如果關閉資料庫,則此句柄會消失,那麼除了掃描磁盤進行檔案恢複之外就沒有其它方法了,是以在資料庫出現問題的時候,如果不确認情況的複雜程度,千萬不要随便關閉資料庫。重新開機資料庫往往是沒有意義的,甚至是緻命的。
當然,客戶的作業系統是Solaris,并且客戶删除的檔案還包括current online redo log,是以還有其它更複雜的操作,不在這裡描述。