楔
在CentOS操作系统中,有一台正常运行的数据库,由于特殊原因,导致误删除了数据文件users01.dbf。
前置条件
在误删文件后,数据库还处于打开状态。
原理
在Linux服务器中,即使文件被删除,只要数据库的进程没有关闭,那么在删除之前打开的进程仍然有该文件的句柄,进程指向的文件仍然能正常读写。
可恢复文件类型
使用此方法可以恢复的文件有数据文件、临时数据文件和控制文件。
解决
1、查找文件进程PID
查看dbw写进程
写进程可能有多个,如果有多个,就需要逐个排查句柄里面包含的数据文件才能知道是哪个被误删除。
[oracle@localhost orcl]$ ps -ef|grep ora_dbw
2、查看进程中的文件
从上一步得到dbw写进程的PID后,就可以去句柄中查找文件了。
进入句柄
[oracle@localhost orcl]$ cd /proc/18309/fd
查看被删除的文件
[oracle@localhost fd]$ ll
被删除的文件会一直闪烁,并且路径后面会跟着(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;
结束
至此,数据库数据文件就恢复完毕。虽然有方法恢复这种误删,但是希望永远都用不到。