閱讀947 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據恢複:如何恢複Linux中意外刪除的Oracle和MySQL數據庫

640?wxfrom=5&wx_lazy=1
張樂奕

雲和恩墨副總經理,Oracle ACE總監,ACOUG 聯合創始人

沒有刪除過數據庫的DBA職業生涯是不完整的刪除過數據庫還能幸存的DBA一定是訂閱了“Oracle”公眾號


昨晚有朋友在微信群中求助討論,誤刪除了一個MySQL的數據庫,整個恢複過程和以下文章中提到的步驟完全相同,隻要MySQL主進程還沒有退出,從文件句柄中可以恢複文件最終挽回損失。類似的lsof找到那些被標記為Deleted的文件(以下是參考示意圖)。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

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

今天有客戶的數據庫意外被刪除了整個目錄中的數據文件,操作係統級別的刪除,然而幸運的是這個數據庫沒有崩潰,仍然處於 open 狀態的時候,客戶就發現了問題,求助到我們,最終完整地恢複了所有數據文件。


在 Linux 下大致重新演示一下恢複的過程,恢複的步驟與數據庫版本沒有太大關係,與操作係統的不同會有所不同。


1. 在數據庫 open 的時候,直接刪除 users 表空間中的數據文件。


640?wx_fmt=png&wxfrom=5&wx_lazy=1


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


640?wx_fmt=png&wxfrom=5&wx_lazy=1


在告警日誌中,同樣也可以看到類似信息。


640?wx_fmt=png&wxfrom=5&wx_lazy=1


3. 檢查 dbwr 的進程 PID


640?wx_fmt=png&wxfrom=5&wx_lazy=1


4. dbwr 會打開所有數據文件的句柄。在 proc 目錄中可以查到,目錄名是進程 PID,fd 表示文件描述符。


640?wx_fmt=png&wxfrom=5&wx_lazy=1


注意其中“/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf (deleted)”字樣,表示該文件已經被刪除,如果是 Solaris 操作係統,ls 命令不會有如此清晰的顯示,為了在 Solaris 係統中確認哪個句柄對應哪個文件,則需要使用 lsof 程序。


5. 直接 cp 該句柄文件名回原位置。


640?wx_fmt=png&wxfrom=5&wx_lazy=1


6. 進行數據文件 recover


640?wx_fmt=png&wxfrom=5&wx_lazy=1


完成數據文件恢複。


恢複的原理是,在 Linux 操作係統中,如果文件從操作係統級別被rm掉,之前打開該文件的進程仍然持有相應的文件句柄,所指向的文件仍然可以讀寫,並且該文件的文件描述符可以從 /proc 目錄中獲得。但是要注意的是,此時如果關閉數據庫,則此句柄會消失,那麼除了掃描磁盤進行文件恢複之外就沒有其它方法了,因此在數據庫出現問題的時候,如果不確認情況的複雜程度,千萬不要隨便關閉數據庫。重啟數據庫往往是沒有意義的,甚至是致命的。


當然,客戶的操作係統是Solaris,並且客戶刪除的文件還包括 current online redo log,因此還有其它更複雜的操作,不在這裏描述。


本文出自數據和雲公眾號,原文鏈接


最後更新:2017-07-18 10:33:42

  上一篇:go  Oracle 12.2新特性掌上手冊 - 第六卷 ADG的性能與診斷
  下一篇:go  Oracle 12.2新特性掌上手冊 - 第七卷 Big Data and Data Warehousing