歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux下如何恢復意外刪除的文件

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

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

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

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_.dbf

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

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: 3

3. 檢查dbwr的進程PID

$ ps -ef|grep dbw0|grep -v grep

oracle    2879     1  0 21:38 ?        00:00:00 ora_dbw0_orcl

本文URL:http://www.bianceng.cn/OS/Linux/201410/45614.htm

4. dbwr會打開所有數據文件的句柄。在proc目錄中可以查到,目錄名是進程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)

l-wx------ 1 oracle dba 64 Dec 19 21:50 8 -> /app/oracle/admin/orcl/bdump/alert_orcl.log

lrwx------ 1 oracle dba 64 Dec 19 21:50 9 -> /app/oracle/product/10.2.0/db_1/dbs/hc_orcl.dat

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

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

cp 19 /app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf

6. 進行數據文件recover

SQL> alter database datafile 4 offline;

Database altered.

SQL> recover datafile 4;

Media recovery complete.

SQL> alter database datafile 4 online;

Database altered.

完成數據文件恢復。

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

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

本文URL:http://www.bianceng.cn/OS/Linux/201410/45614.htm

Copyright © Linux教程網 All Rights Reserved