omniture

數(shù)據(jù)恢復(fù):如何恢復(fù)Linux中意外刪除的文件

2016-03-07 14:34

                          云和恩墨副總經(jīng)理,Oracle ACE總監(jiān),ACOUG 聯(lián)合創(chuàng)始人張樂奕

今天有客戶的數(shù)據(jù)庫意外被刪除了整個(gè)目錄中的數(shù)據(jù)文件,操作系統(tǒng)級別的刪除,然而幸運(yùn)的是這個(gè)數(shù)據(jù)庫沒有崩潰,仍然處于 open 狀態(tài)的時(shí)候,客戶就發(fā)現(xiàn)了問題,求助到我們,最終完整地恢復(fù)了所有數(shù)據(jù)文件。

在 Linux 下大致重新演示一下恢復(fù)的過程,恢復(fù)的步驟與數(shù)據(jù)庫版本沒有太大關(guān)系,與操作系統(tǒng)的不同會(huì)有所不同。

1. 在數(shù)據(jù)庫 open 的時(shí)候,直接刪除 users 表空間中的數(shù)據(jù)文件。

2. 嘗試在 users 表空間中創(chuàng)建表,開始報(bào)錯(cuò)。

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

3. 檢查 dbwr 的進(jìn)程 PID

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

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

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

6. 進(jìn)行數(shù)據(jù)文件 recover

完成數(shù)據(jù)文件恢復(fù)。

恢復(fù)的原理是,在 Linux 操作系統(tǒng)中,如果文件從操作系統(tǒng)級別被rm掉,之前打開該文件的進(jìn)程仍然持有相應(yīng)的文件句柄,所指向的文件仍然可以讀寫,并且該文件的文件描述符可以從 /proc 目錄中獲得。但是要注意的是,此時(shí)如果關(guān)閉數(shù)據(jù)庫,則此句柄會(huì)消失,那么除了掃描磁盤進(jìn)行文件恢復(fù)之外就沒有其它方法了,因此在數(shù)據(jù)庫出現(xiàn)問題的時(shí)候,如果不確認(rèn)情況的復(fù)雜程度,千萬不要隨便關(guān)閉數(shù)據(jù)庫。重啟數(shù)據(jù)庫往往是沒有意義的,甚至是致命的。

當(dāng)然,客戶的操作系統(tǒng)是Solaris,并且客戶刪除的文件還包括 current online redo log,因此還有其它更復(fù)雜的操作,不在這里描述

消息來源:比特網(wǎng)