在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log)
参考原文:
Retrieve deleted files on Unix / Linux using File Descriptors (Doc ID 444749.1)
适用于:
Oracle Database - Enterprise Edition - Version 8.1.7.0 to 11.2.0.3 [Release 8.1.7 to 11.2]
Linux x86
Oracle Solaris on SPARC (64-bit)
Linux x86-64
***Checked for relevance on 24-Nov-2010***
目标:在数据库没有被重启的情况下,从操作系统中找回被删掉的datafile和logfile
解决方案:
当符合下列状态时,我们可以借助unix/linux中的proc 文件系统,找回(retrieve)被删除的datafile和logfile
1.) Database is not restarted.
2.) Server is not restarted.
3.) The file was not offline before deletion.
后台进程(DBWR, PMON, SMON etc)访问被本数据库打开的所有datafiles,因此,借助于lsof命令,可以看到被进程open的 文件列表。
被进程打开的任何一个文件,都有一个文件描述符(fd)与该文件相关联。若是该文件被从操作系统中误删除了,该文件的条目(entry)并没有从proc 文件系统中被删除,借助于该entry,我们可以重建被删除的file(datafile or logfile)
如下是一个例子:
抢救该文件的步骤
1.)找到dbwr进程的os pid
--> $ ps -ef |grep '<SID>'| grep '<name_of_background_process>'
2.)使用lsof命令为该 ospid 找到打开的文件
注意:
If you are using NAS then the file name in the above command may not be displayed properly and hence this procedure should not be used under these circumstances.
注意上面的fd值--270
3.)到fd目录下
将表空间置为read only 冻结了文件头,防止文件头的更新。因为 当database 处于open时,只有在datafile 处于read only状态下 才可能copy 该file。
read only 允许用户select 该表空间,但不允许 对该表空间的insert ,update,delete
7.)将该表空间置为read write
Query view dba_tablespaces to check status of the tablespace:
select tablespace_name,status from dba_tablespaces where tablespace_name='MY_TEST';
8.)对该数据文件的resize操作就正常了。
SQL> alter database datafile '/emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf' resize 250k;
Database altered.
注意:该过程也适用于找回被删除的 current redo logfile
参考原文:
Retrieve deleted files on Unix / Linux using File Descriptors (Doc ID 444749.1)
适用于:
Oracle Database - Enterprise Edition - Version 8.1.7.0 to 11.2.0.3 [Release 8.1.7 to 11.2]
Linux x86
Oracle Solaris on SPARC (64-bit)
Linux x86-64
***Checked for relevance on 24-Nov-2010***
目标:在数据库没有被重启的情况下,从操作系统中找回被删掉的datafile和logfile
解决方案:
当符合下列状态时,我们可以借助unix/linux中的proc 文件系统,找回(retrieve)被删除的datafile和logfile
1.) Database is not restarted.
2.) Server is not restarted.
3.) The file was not offline before deletion.
后台进程(DBWR, PMON, SMON etc)访问被本数据库打开的所有datafiles,因此,借助于lsof命令,可以看到被进程open的 文件列表。
被进程打开的任何一个文件,都有一个文件描述符(fd)与该文件相关联。若是该文件被从操作系统中误删除了,该文件的条目(entry)并没有从proc 文件系统中被删除,借助于该entry,我们可以重建被删除的file(datafile or logfile)
如下是一个例子:
- 1.) Create a tablespace
- SQL> create tablespace my_test datafile '/emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf' size 200k;
- Tablespace created.
- 2.) Accidentally, the datafile belonging to this tablespace was deleted
- $ rm /emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf
- 3.) Try resizing the datafile
- SQL> alter database datafile '/emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf' resize 250k;
- alter database datafile '/emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf' resize 250k
- *
- ERROR at line 1:
- ORA-01565: error in identifying file
- '/emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf'
- ORA-27037: unable to obtain file status
- SVR4 Error: 2: No such file or directory
- Additional information: 3
抢救该文件的步骤
1.)找到dbwr进程的os pid
--> $ ps -ef |grep '<SID>'| grep '<name_of_background_process>'
- $ ps -ef |grep EMR102U6|grep dbw
- emrdbms 21943 1 0 10:27:08 ? 0:00 ora_dbw0_EMR102U6
- $ lsof -p 21943 |grep /emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf
- Command PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- oracle 21943 emrdbms 270uW VREG 304,25 212992 11273825 /emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf
If you are using NAS then the file name in the above command may not be displayed properly and hence this procedure should not be used under these circumstances.
注意上面的fd值--270
3.)到fd目录下
--> $ cd /proc/ <process_id> / <file_descriptor_directory>'/
$ cd /proc/21943/fd/
4.)将该表空间read only- alter tablespace my_test read only;
read only 允许用户select 该表空间,但不允许 对该表空间的insert ,update,delete
5.)对该文件做一个copy
$ cat 270 > /emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf
6.)为了确保 该file 的copy在 copy后没有被使用,执行如下:- a) Take datafile offline
- alter tablespace my_test offline;
- Query the view v$datafile to verify the datafile is offline:
- select status from v$datafile where file#=<file number>;
- b) Bring datafile back online
- alter tablespace my_test online;
7.)将该表空间置为read write
- alter tablespace my_test read write;
select tablespace_name,status from dba_tablespaces where tablespace_name='MY_TEST';
8.)对该数据文件的resize操作就正常了。
SQL> alter database datafile '/emea/rdbms/64bit/app/oracle/oradata/EMR102U6/my_test_01.dbf' resize 250k;
Database altered.
注意:该过程也适用于找回被删除的 current redo logfile