天天看點

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

張樂奕

雲和恩墨副總經理,oracle ace總監,acoug 聯合創始人

沒有删除過資料庫的dba職業生涯是不完整的,删除過資料庫還能幸存的dba一定是訂閱了“oracle”公衆号。

昨晚有朋友在微信群中求助讨論,誤删除了一個mysql的資料庫,整個恢複過程和以下文章中提到的步驟完全相同,隻要mysql主程序還沒有退出,從檔案句柄中可以恢複檔案最終挽回損失。類似的lsof找到那些被标記為deleted的檔案(以下是參考示意圖)。

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

讓我們完整的再複習一下這篇文章的步驟,一定要記住這種方法:

今天有客戶的資料庫意外被删除了整個目錄中的資料檔案,作業系統級别的删除,然而幸運的是這個資料庫沒有崩潰,仍然處于 open 狀态的時候,客戶就發現了問題,求助到我們,最終完整地恢複了所有資料檔案。

在 linux 下大緻重新示範一下恢複的過程,恢複的步驟與資料庫版本沒有太大關系,與作業系統的不同會有所不同。

1. 在資料庫 open 的時候,直接删除 users 表空間中的資料檔案。

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

2. 嘗試在 users 表空間中建立表,開始報錯。

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

在告警日志中,同樣也可以看到類似資訊。

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

3. 檢查 dbwr 的程序 pid

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

4. dbwr 會打開所有資料檔案的句柄。在 proc 目錄中可以查到,目錄名是程序 pid,fd 表示檔案描述符。

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

注意其中“/app/oracle/oradata/orcl/datafile/o1_mf_users_555wrj4o_.dbf (deleted)”字樣,表示該檔案已經被删除,如果是 solaris 作業系統,ls 指令不會有如此清晰的顯示,為了在 solaris 系統中确認哪個句柄對應哪個檔案,則需要使用 lsof 程式。

5. 直接 cp 該句柄檔案名回原位置。

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

6. 進行資料檔案 recover

資料恢複:如何恢複Linux中意外删除的Oracle和MySQL資料庫

完成資料檔案恢複。

恢複的原理是,在 linux 作業系統中,如果檔案從作業系統級别被rm掉,之前打開該檔案的程序仍然持有相應的檔案句柄,所指向的檔案仍然可以讀寫,并且該檔案的檔案描述符可以從 /proc 目錄中獲得。但是要注意的是,此時如果關閉資料庫,則此句柄會消失,那麼除了掃描磁盤進行檔案恢複之外就沒有其它方法了,是以在資料庫出現問題的時候,如果不确認情況的複雜程度,千萬不要随便關閉資料庫。重新開機資料庫往往是沒有意義的,甚至是緻命的。

當然,客戶的作業系統是solaris,并且客戶删除的檔案還包括 current online redo log,是以還有其它更複雜的操作,不在這裡描述。