在CentOS操作系统中,有一台正常运行的数据库,由于特殊原因,导致误删除了数据文件users01.dbf。

前置条件

在误删文件后,数据库还处于打开状态。

原理

在Linux服务器中,即使文件被删除,只要数据库的进程没有关闭,那么在删除之前打开的进程仍然有该文件的句柄,进程指向的文件仍然能正常读写。

可恢复文件类型

使用此方法可以恢复的文件有数据文件、临时数据文件和控制文件。

解决

1、查找文件进程PID

查看dbw写进程

写进程可能有多个,如果有多个,就需要逐个排查句柄里面包含的数据文件才能知道是哪个被误删除。

[oracle@localhost orcl]$ ps -ef|grep ora_dbw

Oracle 误删数据文件解决方法_恢复

2、查看进程中的文件

从上一步得到dbw写进程的PID后,就可以去句柄中查找文件了。

进入句柄

[oracle@localhost orcl]$ cd /proc/18309/fd

查看被删除的文件

[oracle@localhost fd]$ ll

Oracle 误删数据文件解决方法_恢复_02

被删除的文件会一直闪烁,并且路径后面会跟着(deleted)。

3、恢复数据文件至原位置

拷贝至原位置

[oracle@localhost fd]$ cp 261 /home/oracle/oradata/orcl/users01.dbf

4、重启数据库并介质恢复

进入sqlplus命令窗口

[oracle@localhost fd]$ sqlplus / as sysdba

立即关闭数据库

SQL> shutdown immediate

启动数据库

应该启动到mount模式,但是我们不清楚数据文件的FILE_ID,最简单的就是直接启动数据库,让它来提示我们哪个文件有问题。

SQL> startup

介质恢复

SQL> recover datafile 4;

打开数据库

SQL> alter database open;

Oracle 误删数据文件解决方法_恢复_03

结束

至此,数据库数据文件就恢复完毕。虽然有方法恢复这种误删,但是希望永远都用不到。