在生產環境,總會發生資料庫的資料檔案被誤刪除的事情,如SA不懂得資料庫,資料庫的線上日誌為redo01.log,還是cp備份後刪除的,讓人哭笑不得,資料檔案命名為無dbf尾碼等,都容易被誤刪除
在作業系統層面被誤rm的,如果及時發現,還是可以挽救的,下面舉例說明下:
1、查詢資料庫版本和是否歸檔模式
SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit ProductionPL/SQL Release 11.1.0.7.0 - ProductionCORE 11.1.0.7.0 ProductionTNS for Linux: Version 11.1.0.7.0 - ProductionNLSRTL Version 11.1.0.7.0 - ProductionSQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination /archivelogOldest online log sequence 1Next log sequence to archive 1Current log sequence 1
2、fly使用者建立表fly,fly表的記錄數為1128432
SQL> conn fly/flyConnected.SQL> create table fly as select * from dba_objects;Table created.SQL> insert into fly select * from fly;70527 rows created.SQL> /141054 rows created.SQL> /282108 rows created.SQL> /564216 rows created.SQL> commit;Commit complete.SQL> select count(*) from fly;COUNT(*)----------1128432
3、查看fly使用者預設資料表空間的資料檔案,用作業系統命令rm刪除fly使用者預設資料表空間下的所有資料檔案
SQL> conn sys/oracle as sysdbaConnected.SQL> select default_tablespace from dba_users where username='FLY';DEFAULT_TABLESPACE------------------------------USERSSQL> col file_name format a80SQL> set linesize 200SQL> select file_name from dba_data_files where tablespace_name='USERS';FILE_NAME--------------------------------------------------------------------------------/home/oracle/oradata/fly/datafile/users02.dbf/home/oracle/oradata/fly/datafile/user03.dbfSQL> host rm /home/oracle/oradata/fly/datafile/users02.dbfSQL> host rm /home/oracle/oradata/fly/datafile/user03.dbf
4、在fly使用者下建立表fly007,報錯了,注意及時多執行幾次建立表的SQL語句,這邊都只顯示user02.dbf資料檔案不存在了,接下來的恢複中,我們肯定要考慮到到底被誤刪除了幾個資料檔案
SQL> conn fly/flyConnected.SQL> create table fly007 as select * from dba_objects;create table fly007 as select * from dba_objects*ERROR at line 1:ORA-01116: error in opening database file 20ORA-01110: data file 20: '/home/oracle/oradata/fly/datafile/users02.dbf'ORA-27041: unable to open fileLinux-x86_64 Error: 2: No such file or directoryAdditional information: 3
5、查看該檔案是否仍舊被某些進程開啟著
fly007:~ # lsof | grep /home/oracle/oradata/fly/datafile/users02.dbforacle 22297 oracle 32uW REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted)oracle 22301 oracle 42u REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted)oracle 22309 oracle 30u REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted)oracle 22317 oracle 32u REG 8,2 209723392 1410008 /home/oracle/oradata/fly/datafile/users02.dbf (deleted)
6、資料庫的dbwr進程會開啟所有的資料檔案,包括控制檔案,查看dbwr進程的PID為22297
fly007:~ # ps -ef | grep dbw0 | grep -v greporacle 22297 1 0 21:21 ? 00:00:00 ora_dbw0_fly
誤刪除資料檔案恢複原理
當進程開啟了某個檔案時,只要該進程仍舊保持開啟該檔案,即使將該檔案刪除了,該進程仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入操作。在/proc 目錄下,包含了反映核心和進程樹的各種檔案。/proc目錄掛載的是在記憶體中所映射的一塊地區,所以這些檔案和目錄並不存在於磁碟中,因此當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中擷取相關資訊。大多數與lsof 相關的資訊都儲存於以進程的PID 命名的目錄中,即/proc/1116 中包含的是PID 為1116的進程的資訊。每個進程目錄中存在著各種檔案,它們可以使得應用程式簡單地瞭解進程的記憶體空間、檔案描述符列表、指向磁碟上的檔案的符號連結和其他系統資訊。lsof 程式使用該資訊和其他關於核心內部狀態的資訊來產生其輸出。所以lsof 可以顯示進程的檔案描述符和相關的檔案名稱等資訊。也就是我們通過訪問進程的檔案描述符可以找到該檔案的相關資訊。
當系統中的某個檔案被意外的刪除了,只要這個時候系統中還有進程正在訪問該檔案,那麼我們就可以通過lsof從/proc目錄下恢複該檔案的內容
7、進入到dbwr進程的fd檔案描述符)目錄下,需要確定被刪除的資料檔案是不是只有一個user02.dbf,結果發現不是的,10,25,32為fd(檔案描述符)
fly007:~ # cd /proc/22297/fdfly007:/proc/22297/fd # ls -l | grep deletelrwx------ 1 oracle oinstall 64 Dec 6 21:26 10 -> /home/oracle/product/11g/db/dbs/lkinstfly (deleted)lrwx------ 1 oracle oinstall 64 Dec 6 21:26 25 -> /home/oracle/oradata/fly/datafile/user03.dbf (deleted)lrwx------ 1 oracle oinstall 64 Dec 6 21:26 32 -> /home/oracle/oradata/fly/datafile/users02.dbf (deleted)fly007:/proc/22297/fd # ls -l /home/oracle/oradata/fly/datafile/user03.dbf/bin/ls: /home/oracle/oradata/fly/datafile/user03.dbf: No such file or directory
8、拷貝對應檔案描述符為被誤刪除的資料檔案絕對路徑,以下使用root拷貝,注意加上-p參數
fly007:/proc/22297/fd # cp -p 32 /home/oracle/oradata/fly/datafile/users02.dbffly007:/proc/22297/fd # cp -p 25 /home/oracle/oradata/fly/datafile/user03.dbf
9、在資料庫中進行recover datafile恢複操作,資料沒有丟失,完全恢複
fly007:/proc/22297/fd # su - oracleoracle@fly007:~> sqlplus /nologSQL*Plus: Release 11.1.0.7.0 - Production on Fri Dec 6 21:56:45 2013Copyright (c) 1982, 2008, Oracle. All rights reserved.SQL> conn sys/oracle as sysdbaConnected.SQL> alter database datafile '/home/oracle/oradata/fly/datafile/users02.dbf' offline;Database altered.SQL> alter database datafile '/home/oracle/oradata/fly/datafile/user03.dbf' offline;Database altered.SQL> recover datafile '/home/oracle/oradata/fly/datafile/users02.dbf';Media recovery complete.SQL> recover datafile '/home/oracle/oradata/fly/datafile/user03.dbf';Media recovery complete.SQL> alter database datafile '/home/oracle/oradata/fly/datafile/users02.dbf' online;Database altered.SQL> alter database datafile '/home/oracle/oradata/fly/datafile/user03.dbf' online;Database altered.SQL> conn fly/flyConnected.SQL> select count(*) from fly;COUNT(*)----------1128432SQL> create table fly007 as select * from dba_objects;Table created.
資料檔案被誤刪除後,如果關閉資料庫,則dbw0進程消失,沒有了持續開啟誤刪除檔案的進程,就不可以通過此方法進行恢複,因此在資料庫出現問題的時候,如果不確認情況的複雜程度,千萬不要隨便關閉資料庫。重啟資料庫往往是沒有意義的,甚至是致命的,另外,若控制檔案被rm了,通過這種方式是無法恢複的
同時,通過linux的rm刪除了資料檔案,甚至連歸檔日誌都全部刪除了,只要資料庫沒有崩潰,dbw0進程還在,就可以將資料完全恢複,和是否有歸檔日誌沒有關係,但是和是否開啟了歸檔是有區別的,後續繼續討論作業系統層面誤刪除資料庫資料檔案的恢複
本文出自 “斜陽悠悠寸草心” 部落格,請務必保留此出處http://fly1116.blog.51cto.com/8301004/1337681