使用linux文件句柄恢复误删除的Oracle数据文件
测试环境:OEL+Oracle 11.2.0.1
首先查看当前的数据文件及数据文件状态:
SQL> select file_id,tablespace_name,file_name,status from dba_data_files;
FILE_ID TABLESPACE FILE_NAME STATUS
---------- ---------- -------------------------------------- ---------
4 USERS /oradata/orcl2/users01.dbf AVAILABLE
3 UNDOTBS1 /oradata/orcl2/undotbs01.dbf AVAILABLE
2 SYSAUX /oradata/orcl2/sysaux01.dbf AVAILABLE
1 SYSTEM /oradata/orcl2/system01.dbf AVAILABLE
6 BOOK /oradata/orcl2/book.dbf AVAILABLE
5 SG /oradata/orcl2/SG01.dbf AVAILABLE
SQL> select file#,status,name from v$datafile;
FILE# STATUS NAME
---------- ------- ----------------------------------------
1 SYSTEM /oradata/orcl2/system01.dbf
2 ONLINE /oradata/orcl2/sysaux01.dbf
3 ONLINE /oradata/orcl2/undotbs01.dbf
4 ONLINE /oradata/orcl2/users01.dbf
5 ONLINE /oradata/orcl2/SG01.dbf
6 ONLINE /oradata/orcl2/book.dbf
准备对数据文件/oradata/orcl2/SG01.dbf进行rm删除并使用Linux句柄进行恢复,删除后切记不可将实例shutdown(其实shutdown后也没关系,只是会使恢复更麻烦);
删除数据文件/oradata/orcl2/SG01.dbf
[oracle@DBA2 orcl2]$ rm SG01.dbf
[oracle@DBA2 orcl2]$
查看文件句柄,发现/oradata/orcl2/SG01.dbf状态为(delete)如红显处:
[oracle@DBA2 orcl2]$ ps -ef|grep dbw|grep -v grep|awk '{print $2}'
3140
PS:3140 为DBWn进程的pid,DBWn进程引用此句柄对数据文件操作,其实也可以用LGWR等其他Oracle进程,不一定非得用DBWn这个进程的pid;
[oracle@DBA2 orcl2]$ cd /proc/3140/fd
[oracle@DBA2 fd]$ ls -al
total 0
dr-x------ 2 oracle oinstall 0 Sep 4 09:28 .
dr-xr-xr-x 7 oracle oinstall 0 Sep 4 09:28 ..
lr-x------ 1 oracle oinstall 64 Sep 4 09:41 0 -> /dev/null
l-wx------ 1 oracle oinstall 64 Sep 4 09:41 1 -> /dev/null
l-wx------ 1 oracle oinstall 64 Sep 4 09:41 10 -> /u/oracle/diag/rdbms/orcl2/orcl2/trace/orcl2_ora_3056.trc
l-wx------ 1 oracle oinstall 64 Sep 4 09:41 11 -> /u/oracle/diag/rdbms/orcl2/orcl2/trace/orcl2_ora_3056.trm
lr-x------ 1 oracle oinstall 64 Sep 4 09:41 12 -> /u/oracle/product/11.2/rdbms/mesg/oraus.msb