Linux下誤刪資料檔案從檔案控制程式碼恢復資料檔案

abstractcyj發表於2015-12-25
Linux作業系統中,如果檔案從作業系統級別被rm掉,之前開啟檔案的程式仍然持有相應的檔案控制程式碼,所指向的檔案仍然可以讀寫,並且該檔案的檔案描述符仍然可以從/proc目錄讀取。
但是,此時如果關閉資料庫,則此控制程式碼會消失,除了掃描磁碟進行檔案恢復外就沒有其他辦法了。因此在資料庫出現問題的時候,如果不確認情況的複雜程度,千萬不要隨便關閉資料庫。重啟資料庫往往是沒有意義的,甚至是致命的。

原文連結:
http://www.eygle.com/archives/2011/12/oracle_linux_rm_rf.html

以下是我的操作過程。刪除檔案之後,資料庫alert日誌裡出現了警告資訊:
WARNING: inbound connection timed out (ORA-3136)
Fri Dec 25 19:16:26 2015
Errors in file /u01/app/oracle/diag/rdbms/dup01/dup01/trace/dup01_m000_2493.trc:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/u01/app/oracle/oradata/test01/users01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


[oracle@db02 test01]$ ls -l
total 1765152
-rw-r-----. 1 oracle oinstall  10076160 Dec 25 19:14 control01.ctl
-rw-r-----. 1 oracle oinstall 328343552 Dec 26  2015 example01.dbf
-rw-r-----. 1 oracle oinstall 566239232 Dec 25 19:12 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 786440192 Dec 25 19:11 system01.dbf
-rw-r-----. 1 oracle oinstall  30416896 Dec 26  2015 temp01.dbf
-rw-r-----. 1 oracle oinstall 110108672 Dec 25 19:11 undotbs01.dbf
-rw-r-----. 1 oracle oinstall   5251072 Dec 26  2015 users01.dbf
[oracle@db02 test01]$ rm users01.dbf 
[oracle@db02 test01]$ ls -l
total 1760024
-rw-r-----. 1 oracle oinstall  10076160 Dec 25 19:16 control01.ctl
-rw-r-----. 1 oracle oinstall 328343552 Dec 26  2015 example01.dbf
-rw-r-----. 1 oracle oinstall 566239232 Dec 25 19:12 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 786440192 Dec 25 19:15 system01.dbf
-rw-r-----. 1 oracle oinstall  30416896 Dec 26  2015 temp01.dbf
-rw-r-----. 1 oracle oinstall 110108672 Dec 25 19:11 undotbs01.dbf
[oracle@db02 test01]$ ps -ef|grep dbw0|grep -v grep
oracle    2220     1  0 19:05 ?        00:00:00 ora_dbw0_test01
oracle    2269     1  0 19:06 ?        00:00:00 ora_dbw0_dup01
[oracle@db02 test01]$ cd /proc/2269/fd
[oracle@db02 fd]$ ls -l
total 0
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 0 -> /dev/null
l-wx------. 1 oracle oinstall 64 Dec 25 19:18 1 -> /dev/null
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 10 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/lkDUP01
l-wx------. 1 oracle oinstall 64 Dec 25 19:18 11 -> /u01/app/oracle/diag/rdbms/dup01/dup01/trace/dup01_dbw0_2269.trc
l-wx------. 1 oracle oinstall 64 Dec 25 19:18 12 -> /u01/app/oracle/diag/rdbms/dup01/dup01/trace/dup01_dbw0_2269.trm
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 13 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
l-wx------. 1 oracle oinstall 64 Dec 25 19:18 2 -> /dev/null
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 256 -> /u01/app/oracle/oradata/test01/control01.ctl
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 257 -> /u01/app/oracle/fast_recovery_area/test01/control02.ctl
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 258 -> /u01/app/oracle/oradata/test01/system01.dbf
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 259 -> /u01/app/oracle/oradata/test01/sysaux01.dbf
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 260 -> /u01/app/oracle/oradata/test01/undotbs01.dbf
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 261 -> /u01/app/oracle/oradata/test01/users01.dbf (deleted)
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 262 -> /u01/app/oracle/oradata/test01/example01.dbf
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 263 -> /u01/app/oracle/oradata/test01/temp01.dbf
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 3 -> /dev/null
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 4 -> /dev/null
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 5 -> /dev/null
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 6 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 7 -> /proc/2269/fd
lr-x------. 1 oracle oinstall 64 Dec 25 19:18 8 -> /dev/zero
lrwx------. 1 oracle oinstall 64 Dec 25 19:18 9 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_dup01.dat
[oracle@db02 fd]$ cp 261 /u01/app/oracle/oradata/test01/users01.dbf
[oracle@db02 fd]$ sqlplus / as sysdba


SQL*Plus: Release 11.2.0.4.0 Production on Fri Dec 25 19:20:27 2015


Copyright (c) 1982, 2013, Oracle.  All rights reserved.




Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options


SQL> select name from v$datafile;


NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/test01/system01.dbf
/u01/app/oracle/oradata/test01/sysaux01.dbf
/u01/app/oracle/oradata/test01/undotbs01.dbf
/u01/app/oracle/oradata/test01/users01.dbf
/u01/app/oracle/oradata/test01/example01.dbf


SQL> desc v$datafile;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FILE#                                              NUMBER
 CREATION_CHANGE#                                   NUMBER
 CREATION_TIME                                      DATE
 TS#                                                NUMBER
 RFILE#                                             NUMBER
 STATUS                                             VARCHAR2(7)
 ENABLED                                            VARCHAR2(10)
 CHECKPOINT_CHANGE#                                 NUMBER
 CHECKPOINT_TIME                                    DATE
 UNRECOVERABLE_CHANGE#                              NUMBER
 UNRECOVERABLE_TIME                                 DATE
 LAST_CHANGE#                                       NUMBER
 LAST_TIME                                          DATE
 OFFLINE_CHANGE#                                    NUMBER
 ONLINE_CHANGE#                                     NUMBER
 ONLINE_TIME                                        DATE
 BYTES                                              NUMBER
 BLOCKS                                             NUMBER
 CREATE_BYTES                                       NUMBER
 BLOCK_SIZE                                         NUMBER
 NAME                                               VARCHAR2(513)
 PLUGGED_IN                                         NUMBER
 BLOCK1_OFFSET                                      NUMBER
 AUX_NAME                                           VARCHAR2(513)
 FIRST_NONLOGGED_SCN                                NUMBER
 FIRST_NONLOGGED_TIME                               DATE
 FOREIGN_DBID                                       NUMBER
 FOREIGN_CREATION_CHANGE#                           NUMBER
 FOREIGN_CREATION_TIME                              DATE
 PLUGGED_READONLY                                   VARCHAR2(3)
 PLUGIN_CHANGE#                                     NUMBER
 PLUGIN_RESETLOGS_CHANGE#                           NUMBER
 PLUGIN_RESETLOGS_TIME                              DATE


SQL> select file#,name from v$datafile;


     FILE#
----------
NAME
--------------------------------------------------------------------------------
         1
/u01/app/oracle/oradata/test01/system01.dbf


         2
/u01/app/oracle/oradata/test01/sysaux01.dbf


         3
/u01/app/oracle/oradata/test01/undotbs01.dbf




     FILE#
----------
NAME
--------------------------------------------------------------------------------
         4
/u01/app/oracle/oradata/test01/users01.dbf


         5
/u01/app/oracle/oradata/test01/example01.dbf




SQL> alter database datafile 4 offline;   


Database altered.


SQL> recover datafile 4;   
Media recovery complete.
SQL> alter database datafile 4 online;


Database altered.


SQL> 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8520577/viewspace-1962499/,如需轉載,請註明出處,否則將追究法律責任。

相關文章