Oracle數(shù)據(jù)恢復(fù) - Linux / Unix 誤刪除的文件恢復(fù) |
發(fā)布時(shí)間: 2012/8/30 16:57:41 |
今天有客戶的數(shù)據(jù)庫(kù)意外被刪除了整個(gè)目錄中的數(shù)據(jù)文件,操作系統(tǒng)級(jí)別的刪除,然而幸運(yùn)的是這個(gè)數(shù)據(jù)庫(kù)沒有崩潰,仍然處于open狀態(tài)的時(shí)候,客戶就發(fā)現(xiàn)了問題,求助到我們,最終完整地恢復(fù)了所有數(shù)據(jù)文件。 在Linux下大致重新演示一下恢復(fù)的過程,恢復(fù)的步驟與數(shù)據(jù)庫(kù)版本沒有太大關(guān)系,與操作系統(tǒng)的不同會(huì)有所不同。 1. 在數(shù)據(jù)庫(kù)open的時(shí)候,直接刪除users表空間中的數(shù)據(jù)文件。 SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /app/Oracle/oradata/ORCL/datafile/o1_mf_system_555wqbnk_.dbf /app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_555wqxgl_.dbf /app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_555wr5p6_.dbf /app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf SQL> host rm /app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf2. 嘗試在users表空間中創(chuàng)建表,開始報(bào)錯(cuò)。 SQL> create table t tablespace users as select * from dual; create table t tablespace users as select * from dual * ERROR at line 1: ORA-01116: error in opening database file 4 ORA-01110: data file 4: '/app/Oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf' ORA-27041: unable to open file Linux Error: 2: No such file or directory Additional information: 3在告警日志中,同樣也可以看到類似信息。 Mon Dec 19 21:48:17 CST 2011 Errors in file /app/Oracle/admin/orcl/bdump/orcl_m000_3897.trc: ORA-01116: error in opening database file 4 ORA-01110: data file 4: '/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf' ORA-27041: unable to open file Linux Error: 2: No such file or directory Additional information: 33. 檢查dbwr的進(jìn)程PID $ ps -ef|grep dbw0|grep -v grep Oracle 2879 1 0 21:38 ? 00:00:00 ora_dbw0_orcl4. dbwr會(huì)打開所有數(shù)據(jù)文件的句柄。在proc目錄中可以查到,目錄名是進(jìn)程PID,fd表示文件描述符。 $ cd /proc/2879/fd $ ls -l total 0 lr-x------ 1 Oracle dba 64 Dec 19 21:50 0 -> /dev/null lr-x------ 1 oracle dba 64 Dec 19 21:50 1 -> /dev/null lr-x------ 1 oracle dba 64 Dec 19 21:50 10 -> /dev/zero lr-x------ 1 oracle dba 64 Dec 19 21:50 11 -> /dev/zero lr-x------ 1 oracle dba 64 Dec 19 21:50 12 -> /app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb lrwx------ 1 oracle dba 64 Dec 19 21:50 13 -> /app/oracle/product/10.2.0/db_1/dbs/hc_orcl.dat lrwx------ 1 oracle dba 64 Dec 19 21:50 14 -> /app/oracle/product/10.2.0/db_1/dbs/lkORCL lrwx------ 1 oracle dba 64 Dec 19 21:50 15 -> /app/oracle/oradata/ORCL/controlfile/o1_mf_555wq3ng_.ctl lrwx------ 1 oracle dba 64 Dec 19 21:50 16 -> /app/oracle/oradata/ORCL/datafile/o1_mf_system_555wqbnk_.dbf lrwx------ 1 oracle dba 64 Dec 19 21:50 17 -> /app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_555wqxgl_.dbf lrwx------ 1 oracle dba 64 Dec 19 21:50 18 -> /app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_555wr5p6_.dbf lrwx------ 1 oracle dba 64 Dec 19 21:50 19 -> /app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf (deleted) lr-x------ 1 oracle dba 64 Dec 19 21:50 2 -> /dev/null lrwx------ 1 oracle dba 64 Dec 19 21:50 20 -> /app/oracle/oradata/ORCL/datafile/o1_mf_temp_555wrbnz_.tmp lr-x------ 1 oracle dba 64 Dec 19 21:50 21 -> /app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb lr-x------ 1 oracle dba 64 Dec 19 21:50 3 -> /dev/null lr-x------ 1 oracle dba 64 Dec 19 21:50 4 -> /dev/null l-wx------ 1 oracle dba 64 Dec 19 21:50 5 -> /app/oracle/admin/orcl/udump/orcl_ora_2871.trc l-wx------ 1 oracle dba 64 Dec 19 21:50 6 -> /app/oracle/admin/orcl/bdump/alert_orcl.log lrwx------ 1 oracle dba 64 Dec 19 21:50 7 -> /app/oracle/product/10.2.0/db_1/dbs/lkinstorcl (deleted) 注意其中"/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf (deleted)"字樣,表示該文件已經(jīng)被刪除,如果是Solaris操作系統(tǒng),ls命令不會(huì)有如此清晰的顯示,為了在Solaris系統(tǒng)中確認(rèn)哪個(gè)句 柄對(duì)應(yīng)哪個(gè)文件,則需要使用lsof程序。 5. 直接cp該句柄文件名回原位置。 cp 19 /app/Oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf6. 進(jìn)行數(shù)據(jù)文件recover SQL> alter database datafile 4 offline; Database altered. SQL> recover datafile 4; Media recovery complete. SQL> alter database datafile 4 online; Database altered.完成數(shù)據(jù)文件恢復(fù)。 恢復(fù)的原理是,在Linux操作系統(tǒng)中,如果文件從操作系統(tǒng)級(jí)別被rm掉,之前打開該文件的進(jìn)程仍然持有相應(yīng)的文件句柄,所指向的文件仍然可以讀 寫,并且該文件的文件描述符可以從/proc目錄中獲得。但是要注意的是,此時(shí)如果關(guān)閉數(shù)據(jù)庫(kù),則此句柄會(huì)消失,那么除了掃描磁盤進(jìn)行文件恢復(fù)之外就沒有 其它方法了,因此在數(shù)據(jù)庫(kù)出現(xiàn)問題的時(shí)候,如果不確認(rèn)情況的復(fù)雜程度,千萬不要隨便關(guān)閉數(shù)據(jù)庫(kù)。重啟數(shù)據(jù)庫(kù)往往是沒有意義的,甚至是致命的。 當(dāng)然,客戶的操作系統(tǒng)是Solaris,并且客戶刪除的文件還包括current online redo log,因此還有其它更復(fù)雜的操作,不在這里描述。 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |